1

内部に未定義のクラスを持つ CRTP クラスを作成しようとしています --- 派生クラスによって定義されるように、次のようにします。

#include <memory> // unique_ptr

template<typename T>
class crtp
{
    public:
        class inside;

        crtp();

        std::unique_ptr<inside> m;
};

これは、テンプレート化されていないデータ型で機能します。

ただし、たとえば、テンプレート化されたクラスを渡そうとすると、次のようになります。

template<>
template<typename T>
class crtp<test::TestClass<T>>::inside
{
    public:
        inside()
        {
            std::cout << "Instantiated." << std::endl;
        }
};

次のエラーが発生します。

error: invalid class name in declaration of ‘class crtp<test::TestClass<T> >::inside’

gcc 4.6.1 を使用しています。

ここで何が欠けていますか?テンプレートがインスタンス化される方法と関係があるように感じますが、何を探すべきかわかりません。

編集: 明確にするために、crtp のコンストラクターなどは既に別の場所で定義されています (投稿する必要がありますか?それは unique_ptr を初期化するだけです)。私が専門化しなければならない唯一のことは、内部クラスの定義です。

4

1 に答える 1

2

外側のテンプレートを部分的に特殊化して、ネストされたクラスを定義することはできません。完全な特殊化のみが許可されます ( などtemplate <> class crtp<int>::inside)。代わりに、テンプレート全体の部分的な特殊化を提供できます。

template <typename T>
class crtp<test::TestClass<T>>
{
public:
    class inside { /* ... */ };
    // ...
};
于 2012-07-24T23:11:22.167 に答える