2012-10-01 14 views
10

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?

+7

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. –

+1

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

+1 para el caso de prueba mínimo. – Puppy

Respuesta

12

Cada versión de VS es cada vez más estricta al requerir template y typename. Falta un template, y VS2012 tiene razón para quejarse.

+0

+1 para información breve y concisa –

+1

Puede señalar dónde. (antes de 'Nested', ya que el compilador no puede adivinar que' T :: Nested' es una plantilla hasta que se crea una instancia de la plantilla) – MSalters

Cuestiones relacionadas