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)?
La soluzione è corretta, ma non sono così sicuro della spiegazione. Non appena il compilatore raggiunge 'Foo :: pippo', tornerà indietro e "sistemerà" il tipo di ritorno. Se non lo facesse, non corrisponderebbe alla dichiarazione di "pippo" (nella classe) con la definizione (cioè, avvertirebbe che i tipi di ritorno erano diversi). Questo non ha nulla a che fare con la ricerca in due fasi come per il tuo link. –
Credo di essermi sbagliato nel collegamento di ricerca a due stadi. La spiegazione corretta è: quando si cerca un nome dipendente nidificato (uno che si basa su un parametro modello sconosciuto, i.e Foo :: Bar), si presume che non sia un tipo. L'unica eccezione è durante l'elenco delle classi di base. Come per il compilatore che aggiusta il tipo di ritorno - no, l'istanziazione del template avviene molto dopo; l'errore viene ricevuto durante la prima scansione eseguita dal compilatore sul codice – ASk