2015-10-29 63 views
4

我們減少了一部分代碼,我們無法找到正確的語法以作爲最小示例。等同於「typename」,表示從屬名稱確實是'模板模板參數'

假設下面的定義(不擔心有關「爲什麼」;)現在

template <class> 
class Element 
{}; 

template <template <class> class> 
class Client 
{}; 

template <class> 
struct TemplatedProvider 
{ 
    template <class T> 
    using element_template = Element<T>; 
}; 

,用C++ 11以後,我們可以使用一個類模板或類型別名模板實例化Client模板。下面的函數編譯就好:

void fun() 
{ 
    Client<Provider::element_template> client; 
    Client<TemplatedProvider<int>::element_template> clientBis; 
} 

但我們無法找到在以下情況下,當給Client模板參數是一個從屬名稱的正確語法:

template <class T> 
void templatedFun() 
{ 
    Client<TemplatedProvider<T>::element_template> client; 
} 

鏘(3.6測試)發出以下編譯錯誤:

template argument for template template parameter must be a class template or type alias template 

我們可以修復這個語法嗎?

回答

4

可以使用template關鍵字:

template <class T> 
void templatedFun() 
{ 
    Client<TemplatedProvider<T>::template element_template> client; 
} 

有關templatetypename關鍵字的詳細論述,請參閱this question

+0

附加信息鏈接 – GreatAndPowerfulOz

9

它必須是:

template <class T> 
void templatedFun() 
{ 
    Client<TemplatedProvider<T>::template element_template> client; 
}