2

以下のように、ネストされたクラスの完全修飾名を使用しようとしていますが、コンパイラーが動作しません!

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

完全修飾名を使用すると、このネストされたクラスにアクセスできると思っていましたか? おそらく顔を殴られるだろうが、一体何が見えないのだろう??

4

1 に答える 1

6

それはおそらく、コードで行うことではありません。エラーメッセージは、これを行うように見えます

Apple<K>::Banana freshBanana = someVar.returnsABanana();

コンパイラは、コードを解析する前に、名前が型を示しているかどうかを認識している必要があります。この場合、それが解析するとき、型が何であるかはまだわかっていないため、わかりません (そのネストされたクラスを持たないKための特殊化を行うことができます)。したがって、はタイプではないApple<int>と想定します。Apple<K>::Bananaただし、それは式であり、演算子またはセミコロンの後に必要です。

挿入することで修正できますtypename

typename Apple<K>::Banana freshBanana = someVar.returnsABanana();

それは名前が型であると主張し、コンパイラはこれを宣言として解析することを認識します。

于 2010-03-28T11:42:38.903 に答える