在模板化类型的CRTP中定义类型

时间:2012-07-24 22:50:45

标签: c++ templates crtp

我正在尝试创建一个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)。我唯一需要专门研究的是内部类的定义。

1 个答案:

答案 0 :(得分:2)

您无法对外部模板进行部分专门化以定义嵌套类;只允许完全专业化(例如template <> class crtp<int>::inside)。相反,您可以提供整个模板的部分特化:

template <typename T>
class crtp<test::TestClass<T>>
{
public:
    class inside { /* ... */ };
    // ...
};