Ho ereditato un progetto che fa un uso massiccio della meta metrologia dei modelli e sono ora in fase di aggiornamento da Visual Studio 2010 al 2012. Alcuni codici modello non funzionano più nel 2012. Ho distillato un esempio minimo:Perché questo codice modello funziona in VS2010, ma non in VS2012?
template <typename T, int i>
class MyClass
{
private:
typedef typename T::Nested<i> Found;
};
dà questo messaggio di errore:
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 ';'
Più in basso nella MyClass
, posso usare T::Nested<i>
, è solo l'typedef
che non funziona.
Questo esempio viene compilato nel 2010, ma non nel 2012. Cosa c'è di sbagliato con questo codice?
Non 100% (quindi non è una risposta) ma credo che manchi un 'template':' typedef typename T :: template Nested Found; 'o qualcosa di simile. –
Aggiungendo semplicemente alle informazioni di David, è sempre consigliabile esporre il codice del template di Visual C++ su g ++. E in generale, per compilare il codice con almeno due compilatori diversi. Ai vecchi tempi, chi era veramente serio a riguardo usava Comeau, ma non sono sicuro che sia stato aggiornato a una maggiore conformità al C++ 11. –
+1 per il caso di test minimale. – Puppy