入れ子になったクラスとgccのリターンエラー
-
22-09-2019 - |
質問
私は以下のように私の入れ子になったクラスの完全修飾名を使用しようとしていますが、コンパイラがbalkingさ!
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
}
};
私の問題があり、コンパイラは述べています:
Carrot.h:85: error: expected ';' before 'freshBanana'
Carrot.h:86: error: 'freshBanana' was not declared in this scope
私は、完全修飾名を使用すると、この入れ子になったクラスにアクセスするために私を許可することを考えていましたか?おそらく私の顔をピシャリために起こっているが、地球上で何が、私は??
ここでは見ていないです解決
これはあなたのコードで何をすべきか、おそらくではありません。あなたのようなエラーメッセージのルックスは、この
を行いますApple<K>::Banana freshBanana = someVar.returnsABanana();
コンパイラは、名前の名前タイプかどうかのコードを解析する前に知っていなければなりません。この場合には、解析するときにどのようなタイプK
あるので、それは知ることができない、まだ(あなたがその入れ子になったクラスを持っていないApple<int>
のための専門を持っている可能性が)知られていません。だから、Apple<K>::Banana
がタイプではありません想定しています。しかし、その後、それが表現され、オペレータは、それまたはセミコロンの後に必要とされています。
あなたはtypename
を挿入することによって、それを修正することができます:
typename Apple<K>::Banana freshBanana = someVar.returnsABanana();
名前をアサート型であり、コンパイラは、宣言としてこれを解析するために知っています。
所属していません StackOverflow