2012-07-24 131 views
1

我试图创建一个具有里面一个未定义类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)。我想要专门做的唯一事情就是内部类的定义。

+0

您能否更详细地描述您为什么使用CRTP?你想创建一个'std :: unique_ptr '你可以在哪里传递'T'?我不明白内部课堂的必要性。 – TemplateRex 2012-07-25 06:24:37

+0

基本上,我试图让它有一个不同的内部类,这里有一个通用接口,在这种情况下派生类(TestClass)可以访问。一个可能更好的比较是像pimpl设置,其中内部包含该类的实际私人工作。 – Kozaki 2012-07-25 17:32:56

回答

2

您不能部分专门化外层模板来定义嵌套类;只允许完全专业化(如template <> class crtp<int>::inside)。相反,您可以提供整个模板的部分专业化:

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

Hrm,我明白了。但是,据我所知,这需要我复制我所做的每个部分专业化的全部crtp实现(例如,crtp的构造函数,数据成员等)。用一些代码进行的快速测试表明,例如,我必须重新记录像unique_ptr之类的东西,否则专业化无法访问它,而不是我能够为TestClass保留一致的模板接口来使用它。 – Kozaki 2012-07-25 17:38:55

+0

你总是可以将事物考虑在内,这样你就不必重复自己。例如,你可以在附加的'namespace detail'中定义一个'template class next_to;',然后在你的类中定义'typedef detail :: next_to inside'。 – 2012-07-25 22:24:27