2012-10-01 15 views
10

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?

+7

Non 100% (quindi non è una risposta) ma credo che manchi un 'template':' typedef typename T :: template Nested Found; 'o qualcosa di simile. –

+1

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

+1 per il caso di test minimale. – Puppy

risposta

12

Ogni versione VS è sempre più rigida sulla richiesta di template e typename. Manca uno template e VS2012 ha ragione di lamentarsi.

+0

+1 per breve e conciso –

+1

Si potrebbe indicare dove. (prima di 'Nested', poiché il compilatore non può indovinare che' T :: Nested' è un modello fino a quando il modello non viene istanziato) – MSalters

Problemi correlati