我正在尝试创建一个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)。我唯一需要专门研究的是内部类的定义。
答案 0 :(得分:2)
您无法对外部模板进行部分专门化以定义嵌套类;只允许完全专业化(例如template <> class crtp<int>::inside
)。相反,您可以提供整个模板的部分特化:
template <typename T>
class crtp<test::TestClass<T>>
{
public:
class inside { /* ... */ };
// ...
};