2012-07-24 155 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