2009-05-24 18 views
9

Perché il seguente codice mi dà un errore (g ++ 4.1.2)?Funzione membro temporizzata con valore restituito typedef

template<class A> 
class Foo { 
public: 
    typedef std::vector<A> AVec; 
    AVec* foo(); 
}; 

template<class A> 
Foo<A>::AVec* Foo<A>::foo() { // error on this line 
    return NULL; 
} 

L'errore è:

error: expected constructor, destructor, or type conversion before '*' token 

Come faccio a definire la funzione Foo<A>::foo() altrimenti (con il tipo di ritorno corretto)?

risposta

17

Questo è un problema chiamato "two-stage lookup". Fondamentalmente, dal momento che A è un parametro di modello nella definizione di foo(), il compilatore non può sapere quando analizza il modello per la prima volta, se Foo<A>::AVec è un tipo o esiste anche (poiché, ad esempio, potrebbe esistere una specializzazione di Foo<Bar> che non contiene affatto il typedef). Saprà solo di cosa si tratta durante l'istanziazione modello , cosa che succederà più tardi - ed è troppo tardi per questa fase.

Il modo corretto sarebbe quello di utilizzare la parola chiave typename per indicare che si tratta di un tipo:

template<class A> 
class Foo { 
public: 
    typedef std::vector<A> AVec; 
    AVec* foo(); 
}; 

template<class A> 
typename Foo<A>::AVec* Foo<A>::foo() { 
    return NULL; 
} 
-1

Non lo so, ma prova a inserire il typedef al di fuori della classe.

13

Il solito typename problema:

template<class A> 
typename Foo<A>::AVec* Foo<A>::foo() { // error on this line 
    return NULL; 
} 

Ricorda: Come regola generale, tutti qualificati i nomi che dipendono da un parametro del modello devono essere preceduti da typename.

+0

Tranne l'elenco della classe base e l'inizializzazione della classe base in cui non è consentito il nome del tipo. –

+1

@Johan corretto. . –

Problemi correlati