2015-10-29 27 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; 
}