He heredado un proyecto que hace un uso intensivo de meta programación de plantillas, y ahora estoy en el proceso de actualización de Visual Studio 2010 a 2012. Parte del código de plantilla ya no funciona en 2012. He destilado un ejemplo mínimo:¿Por qué este código de plantilla funciona en VS2010, pero no en VS2012?
template <typename T, int i>
class MyClass
{
private:
typedef typename T::Nested<i> Found;
};
le da a este mensaje de error:
source.cpp(5): error C2059: syntax error : '<'
source.cpp(6) : see reference to class template instantiation 'MyClass<T,i>' being compiled
source.cpp(5): error C2238: unexpected token(s) preceding ';'
Más abajo, en MyClass
, puedo usar T::Nested<i>
, es sólo el typedef
que no funciona.
Este ejemplo se compila en 2010, pero no en 2012. ¿Qué hay de malo en este código?
No es 100% (por lo tanto, no es una respuesta), pero creo que le falta una 'plantilla':' typedef typename T :: template Anidado Found; 'o algo por el estilo. –
Simplemente agregando información de David, siempre es una buena idea exponer el código de la plantilla de Visual C++ a g ++. Y, en general, para hacer que el código se compile con al menos dos compiladores diferentes. En el pasado, la gente que hablaba en serio usaba Comeau, pero no estoy seguro de si se ha actualizado a una conformidad más completa de C++ 11. –
+1 para el caso de prueba mínimo. – Puppy