質問

私は以下のように私の入れ子になったクラスの完全修飾名を使用しようとしていますが、コンパイラが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();
名前をアサート型であり、コンパイラは、宣言としてこれを解析するために知っています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top