2012-10-01 12 views
10

Ich habe ein Projekt macht intensiven Gebrauch von Vorlage Meta-Programmierung und bin nun in dem Prozess der Aktualisierung von Visual Studio 2010 bis 2012. Einige des Template-Code geerbt funktioniert nicht mehr im Jahr 2012. I ein minimales Beispiel destilliert habe:Warum funktioniert dieser Vorlagencode in VS2010, aber nicht in VS2012?

template <typename T, int i> 
class MyClass 
{ 
private: 
    typedef typename T::Nested<i> Found; 
}; 

gibt diese Fehlermeldung:

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 ';' 

Weiter unten in MyClass, ich T::Nested<i> verwenden können, ist es nur die typedef, das nicht funktioniert.

Dieses Beispiel stellt im Jahr 2010, aber nicht im Jahr 2012. Was ist mit diesem Code falsch?

+7

Nicht 100% (also keine Antwort), aber ich glaube, dass Sie eine 'template' fehlen:' typedef typename T :: template Verschachtelte gefunden; 'oder gleich etwas. –

+1

Hinzufügen Nur um Davids Info, es ist immer eine gute Idee, Visual C++ Template-Code zu g ++ zu belichten. Und im Allgemeinen, um den Code mit mindestens zwei verschiedenen Compilern kompilieren zu lassen. In den alten Tagen haben Leute, die es wirklich ernst meinten, Comeau benutzt, aber ich bin mir nicht sicher, ob es auf eine vollständigere C++ 11-Konformität aktualisiert wurde. –

+1

+1 für minimalen Testfall. – Puppy

Antwort

12

Jede VS-Version ist mehr und mehr streng über template und typename erfordern. Sie vermissen eine template, und VS2012 ist richtig zu beschweren.

+0

+1 für kurze und prägnante –

+1

Sie, wo Punkt könnte aus. (vor 'Nested', da der Compiler nicht erraten kann, dass' T :: Nested' eine Vorlage ist, bis die Vorlage instanziiert wird) – MSalters

Verwandte Themen