3

内部クラスと内部クラスへのポインター型の静的メンバーを持つここのようなテンプレート クラスを (ヘッダーに) 持っています。

template <class t> class outer {
    class inner {
        int a;
    };

    static inner *m;
};

template <class t> outer <t>::inner *outer <t>::m;

その静的メンバーを定義したいとき、最後の行に「エラー: '*' トークンの前にコンストラクタ、デストラクタ、または型変換が必要です」と表示されます (mingw32-g++ 3.4.5)

4

1 に答える 1

4

innerクラスがtypenameであることを修飾する必要があります。これは、テンプレート パラメーターに依存しており、C++ コンパイラはinnerこのコンテキストの名前が型ではないと想定しているためです。

template <class t> typename outer<t>::inner* outer<t>::m;

根拠:inner上記の行の名前は型名に依存しtます。名前innerの意味innert. たとえば、コードの別の場所に、次のouterクラスの特殊バージョンがあるとしintます。

template <>
class outer<int> {
    int inner;
};

現在、outer<int>::innerタイプに名前を付けることはなくなりました。メンバー変数に名前を付けます。

したがって、一般的に の意味はあいまいであり、C++ は が型を指定していないouter<t>::innerと仮定してこのあいまいさを解決します。あなたが言わない限り、 : をプレフィックスとして付けます。(このコンテキストでは、 はの正確なタイプに依存するため、依存名と呼ばれます。)innertypenametypename outer<t>::innerinnert

于 2010-03-21T14:39:47.063 に答える