2013-01-16 99 views
1

我正在使用VS 2008(抱歉,無法更新)。我需要模板專門化爲我的列表類。我想要專注的參數是成員函數指針。使用成員函數指針專用模板類

總之,我怎樣才能使下面的代碼工作(我不能使用可變參數模板):

// two or three args 
template <typename T1, typename T2, void (T1::* FUNC)(const T2&) = 0> struct list; 
// specialized code for 2 args. 
template <typename T1, typename T2> struct list<T1, T2> { }; 

的錯誤信息是:

C2754: '專業化':將部分專業化不能有一個獨立的非模板參數

也許我的問題沒有解決方案。但這也是一個答案。

感謝您的幫助提前。

+0

這可能是您將使用委託的那些實例之一。 http://msdn.microsoft.com/en-us/library/213x8e7w%28v=vs.90%29.aspx – Tebc

+3

爲什麼你需要專業化?主模板具有默認參數,這意味着您可以忽略它。你想要達到什麼目的? –

+0

如果成員函數指針爲空,我必須實現一個完整的不同列表類。並且希望將這兩個實現分開以使其具有乾淨的代碼(no if ... else)。 – zussel

回答

2

如果我確實正確理解你想要達到什麼,它不能完成。讓我們考慮非法專業化的甚至簡單的情況:

template <typename T1, typename T2, void (T1::* FUNC)(const T2&)> struct list; 
template <typename T1, typename T2> struct list<T1, T2, 0> { }; 

在這裏你總是必須提供三個參數來實例化模板,並嘗試專注主模板的情況下最後一個參數是一個空指針。

§C++標準的14.5.5/8

「的類型對應於一個專門的非類型參數模板參數的應不依賴於專門的參數[。例如:

template <class T, T t> struct C {}; 
template <class T> struct C<T, 1>; // error 

template< int X, int (*array_ptr)[X] > class A {}; 
int array[5]; 
template< int X > class A<X,&array> { }; // error 

末端示例]

不能專門的非典型值e參數,其類型依賴於模板參數列表中的其他類型。因此,上述專業化是非法的。

您最初的設計就是這種專業化,其中最後一個(非類型)參數有一個默認的參數值,你在專業化忽略的特定情況下(忽略它是合法的本身)。這是非法的原因是不是與默認參數的存在相關,而是與您正嘗試專門化具有依賴類型的非類型參數有關。

+0

感謝您的解釋!這對我來說很有意義。現在我必須爲我的問題尋找另一種解決方案。 – zussel