2011-09-26 174 views
6

我有一個帶有int和模板模板參數的模板類。 現在我要專注一個成員函數:如何使用模板模板參數專門化模板類的成員

template <int I> class Default{}; 
template <int N = 0, template<int> class T = Default> struct Class 
{ 
    void member(); 
}; 

// member definition 
template <int N, template<int> class T> inline void Class<N, T>::member() {} 

// partial specialisation, yields compiler error 
template <template<int> class T> inline void Class<1, T>::member() {} 

誰能告訴我,如果這是可能的,什麼我就上線做錯了什麼?

編輯:我想感謝大家的投入。由於我還需要針對某些T的專業化,因此我選擇了Nawaz提出的解決方法,並專門研究整個班級,因爲它只有一個成員函數和一個數據成員。

回答

6

你不能部分地專門化一個單一的成員函數,你必須爲整個類做這件事。

template <int I> class Default{}; 
template <int N = 0, template<int> class T = Default> struct Class 
{ 
    void member(); 
}; 

// member definition 
template <int N, template<int> class T> inline void Class<N, T>::member() {} 

// partial specialization 
template <template<int> class T> struct Class<1, T> 
{ 
    void member() {} 
}; 
2

在C++中,您不允許部分專門化一個函數;你只能部分地專門化類和結構。我相信這也適用於成員函數。

3

由於這是不允許的,這裏是一個解決辦法:

template <int I> class Default{}; 

template <int N = 0, template<int> class T = Default> 
struct Class 
{ 
    void member() 
    { 
     worker(int2type<N>()); //forward the call 
    } 
private: 
    template<int N> struct int2type {}; 

    template<int M> 
    void worker(const int2type<M>&) //function template 
    { 
     //general for all N, where N != 1 
    } 
    void worker(const int2type<1>&) //overload 
    { 
     //specialization for N == 1 
    } 
}; 

的想法是,當N = 1,函數調用worker(int2type<N>())解析到第二功能(專業化),因爲我們傳遞一個int2type<1>類型的實例。否則,第一個,一般的功能將被解決。