定义模板类型
我试图创建一个具有里面一个未定义类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)。我想要专门做的唯一事情就是内部类的定义。
您不能部分专门化外层模板来定义嵌套类;只允许完全专业化(如template <> class crtp<int>::inside
)。相反,您可以提供整个模板的部分专业化:
template <typename T>
class crtp<test::TestClass<T>>
{
public:
class inside { /* ... */ };
// ...
};
Hrm,我明白了。但是,据我所知,这需要我复制我所做的每个部分专业化的全部crtp实现(例如,crtp的构造函数,数据成员等)。用一些代码进行的快速测试表明,例如,我必须重新记录像unique_ptr之类的东西,否则专业化无法访问它,而不是我能够为TestClass保留一致的模板接口来使用它。 – Kozaki 2012-07-25 17:38:55
你总是可以将事物考虑在内,这样你就不必重复自己。例如,你可以在附加的'namespace detail'中定义一个'template
您能否更详细地描述您为什么使用CRTP?你想创建一个'std :: unique_ptr'你可以在哪里传递'T'?我不明白内部课堂的必要性。 –
TemplateRex
2012-07-25 06:24:37
基本上,我试图让它有一个不同的内部类,这里有一个通用接口,在这种情况下派生类(TestClass)可以访问。一个可能更好的比较是像pimpl设置,其中内部包含该类的实际私人工作。 – Kozaki 2012-07-25 17:32:56