gcc restituisce l'errore con classe annidata
-
22-09-2019 - |
Domanda
Sto tentando di usare il nome completo della mia classe annidata come sotto, ma il compilatore sta esitando!
template <class T> class Apple {
//constructors, members, whatevers, etc...
public:
class Banana {
public:
Banana() {
//etc...
}
//other constructors, members, etc...
};
};
template <class K> class Carrot{
public:
//etc...
void problemFunction()
{
Apple<int>::Banana freshBanana = someVar.returnsABanana(); //line 85
giveMonkey(freshBanana); //line 86
}
};
Il mio problema è, il compilatore dice:
Carrot.h:85: error: expected ';' before 'freshBanana'
Carrot.h:86: error: 'freshBanana' was not declared in this scope
I aveva pensato che utilizzando il nome completo mi ha permesso di accedere a questa classe annidata? E 'probabilmente andando a schiaffeggiare me in faccia, ma cosa diavolo sono io non vedere qui ??
Soluzione
Questo probabilmente non è quello che si fa nel codice. Il messaggio di errore si presenta come si esegue questa operazione
Apple<K>::Banana freshBanana = someVar.returnsABanana();
Il compilatore deve sapere prima che analizza il codice se un nome nomi di un tipo o meno. In questo caso, quando si analizza, non può sapere perché ciò che K
tipo è, non è ancora noto (si potrebbe avere una specializzazione per Apple<int>
che non ha quella classe annidata). Così assume Apple<K>::Banana
non è un tipo. Ma poi, è un'espressione e un operatore è necessaria dopo o una virgola.
È possibile risolvere il problema da typename
inserimento:
typename Apple<K>::Banana freshBanana = someVar.returnsABanana();
Questo afferma il nome è un tipo, e il compilatore sa poi per analizzare questo come una dichiarazione.