2

次の構造のテンプレート クラスがあります。

//CFoo.hpp (header file)
template <typename T>
class CFoo {
        struct SFoo {
            T *ptr;
            /* rest is irrelevant */
        } *foo;

    public:
    /* omitting irrelevant parts */
    SFoo* get();
};

ここで、ヘッダー ファイル内に SFoo* get()メソッドを実装すると、すべてがうまく機能します。ただし、宣言と定義を分離すると、コードは次のコンパイル エラーで動作しなくなります。

//CFoo.cpp (source code, example 1)
/* omitting irrelevant parts */
template <typename T>
SFoo* CFoo<T>::get() { return foo; } //ERROR HERE

エラー:<where-is-the-error>: error: ‘SFoo’ does not name a type

//CFoo.cpp (source code, example 2)
/* omitting irrelevant parts */
template <typename T>
CFoo<T>::SFoo* CFoo<T>::get() { return foo; } //ERROR HERE

エラー:<where-is-the-error>: error: need ‘typename’ before ‘CFoo<T>::SFoo’ because ‘CFoo<T>’ is a dependent scope

それを修正する方法についてのヒントを楽しみにしています。前もって感謝します。

4

3 に答える 3

5

を使用して依存型を修飾する必要がありますtypename「template」および「typename」キーワードをどこに、なぜ入力しなければならないのですか? を参照してください。

//CFoo.cpp (source code, example 2)
/* omitting irrelevant parts */
template <typename T>
typename CFoo<T>::SFoo* CFoo<T>::get() { return foo; }
^^^^^^^^

C++ 11では、関数名の後にスコープ内にあるため、auto代わりに使用できますSFoo

template <typename T>
auto CFoo<T>::get() -> SFoo* { return foo; }
于 2012-12-22T11:51:36.513 に答える
1

SFooクラス宣言の外にいるときは、完全修飾する必要があります: typename CFoo<T>::SFoo.

于 2012-12-22T11:51:49.493 に答える
1

一般typenameに、テンプレート パラメーターに依存する名前が型である場合は常に使用する必要があります。

template <typename T>
typename CFoo<T>::SFoo* CFoo<T>::get() { return foo; }

§ 14.6.2 名前解決

テンプレートの宣言または定義で使用され、テンプレート パラメーターに依存する名前は、該当する名前検索で型名が検出されるか、名前がキーワード typename によって修飾されない限り、型に名前を付けないと見なされます。

于 2012-12-22T11:53:54.993 に答える