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 ??

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top