2010-07-06 10 views
13
#include <iostream> 
#include <vector> 

int main() 
{ 
    class Int { 
     public: 
      Int(int _i) : i(i) {} 
     private: 
      int i; 
    }; 

    std::vector<Int> VI; 
} 

provo a compilare il codice di cui sopra ed ha ottenuto il seguente messaggio di errore:Perché la creazione di un tipo di vettore locale fallire

foo.cc: In function 'int main()': 
foo.cc:13: error: 'main()::Int' uses local type 'main()::Int' 
foo.cc:13: error: trying to instantiate 'template<class _Alloc> class std::allocator' 
foo.cc:13: error: template argument 2 is invalid 
foo.cc:13: error: invalid type in declaration before ';' token 

Potrebbe qualcuno di voi dirmi perché non posso fare cose come questa in C++? Grazie in anticipo.

+0

Non è la stessa domanda, ma un'altra domanda sullo stesso problema: [utilizzando classi locali con algoritmi stl] (http://stackoverflow.com/questions/742607/using-local-classes-with-stl-algorithms) –

risposta

11

Lo standard esclude esplicitamente l'utilizzo di classi locali per creare un'istanza di modelli in 14.3.1 [temp.arg.type]/2.

Un tipo locale, un tipo senza collegamento, un tipo senza nome o un tipo composto da uno di questi tipi non deve essere utilizzato come argomento modello per un parametro di tipo di modello.

Questo verrà modificato in C++ 0x.

+1

grazie, ma perché? –

+2

Non conosco le ragioni della decisione in passato, ma il fatto che abbiano modificato questa limitazione in C++ 0x sembra implicare che le ragioni non erano così forti o necessarie per essere superate per altre caratteristiche linguistiche che sono stati introdotti --think lambda, che in realtà creano oggetti funzione in atto. –

+4

AFAIK il vecchio problema era con l'istanziazione del modello. Il compilatore deve decidere se 'std :: vector ' è già istanziato, quando vede la definizione di 'VI'. Ciò significa che deve essere in grado di identificare con precisione la definizione di "Int" per istanziare quel particolare 'std :: vector '. Hai effettivamente bisogno di un nome univoco per "Int". Nell'esempio sopra, potresti avere qualcosa come '__main__Int', ma con gli scope senza nome nidificati questo è ancora più difficile. – MSalters

Problemi correlati