4

サブクラスのインスタンスを返すテンプレートクラスのメンバー関数を定義する正しい方法はありますか?

VC++2010でコンパイルされない例を次に示します。

template<class T> class A {
public:
    class B {
    public:
        T i;
    };

    A();
    B* foo();
};

/////////////////////////////////////////////

template<class T> A<T>::A() {}

template<class T> A<T>::B* A<T>::foo() {
    cout << "foo" << endl;
    return new B();
}

私は得る

Error   8   error C1903: unable to recover from previous error(s); stopping compilation 

の定義foo始まる行で。

iostreamなどの正しいインクルージョンと名前空間宣言があります。

みんなありがとう!

編集:

要求に応じて、エラーの完全なリストをすべて同じ行に示します。

Warning 1   warning C4346: 'A<T>::B' : dependent name is not a type
Error   2   error C2143: syntax error : missing ';' before '*'
Error   3   error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
Error   4   error C1903: unable to recover from previous error(s); stopping compilation
Warning 5   warning C4346: 'A<T>::B' : dependent name is not a type
Error   6   error C2143: syntax error : missing ';' before '*'
Error   7   error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
Error   8   error C1903: unable to recover from previous error(s); stopping compilation
4

1 に答える 1

5

名前A<T>::Bは依存しているので、依存している名前がタイプであることをコンパイラーに示唆する必要があります

template<class T> typename A<T>::B* A<T>::foo() {...}

この行についても同じです:return new B();->return new typename A<T>::B();

読む:「template」および「typename」キーワードをどこに、なぜ配置する必要があるのですか?

于 2012-07-10T14:06:03.543 に答える