2015-07-10 88 views
2

我儘量做到以下幾點,我認爲例子應該是自我解釋:模板參數,它也是一個模板參數

template <class CLASS, class PARAM> 
void call(){ 
    CLASS<PARAM>::do_something(); 
} 

在第3行CLASS和param之間的角括號,編譯器說:

error: expected unqualified-id

我能解決這個問題,或者它不允許我嘗試做?

+0

[C++中模板模板參數有什麼用處?](http://stackoverflow.com/questions/213761/what-are-some-uses-of-template-template-parameters-in- c) – soon

+0

你如何期望*使用*這個?也許'請致電()'?或者'撥打< vector>()'?後者可能會改變'call'的簽名。 –

回答

3

參數CLASS聲明模板是一個class,或者也可以是typename,即類型的名稱。

template<typename X> struct A; 

這裏A不是一個類型,它是一個模板。要獲得類型,您需要「應用」(*)模板:A<int>

如果你寫了CLASS<PARAM>,你試圖將類型應用到類型。這不起作用。這就像試圖調用一個值42(parameter),只在類型級別。

所以你需要指定CLASS東西可以應用,這是一個模板:

template <typename T> class CLASS 

因此,僅供參考,完整的解決方案是:

template <template <typename T> class CLASS, class PARAM> 
void call(){ 
    CLASS<PARAM>::do_something(); 
} 

(*)模板是類型級別的函數:它採用一種或多種類型,並返回一個新類型。

4
template < 
    template <typename T> class CLASS, 
    typename PARAM> 
void call() 
{ 
    CLASS<PARAM>::do_something(); 
} 
0

除了@DanielJour和@Nasser給出的答案之外,我想提及的是模板模板參數CLASS的類型名稱的名稱T可以省略,因爲它沒有被使用。因此,濃縮液是這樣的:

template <template <typename> class CLASS, typename PARAM> 
void call() 
{ 
    CLASS<PARAM>::do_something(); 
} 

參考:Template Template Parameters