我们将一部分无法找到正确语法的代码减少到最小的例子。
让我们假设以下定义(不用担心“为什么”;)
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;
}
Clang(用3.6测试)发出以下编译错误:
template argument for template template parameter must be a class template or type alias template
我们可以修复这种语法吗?
答案 0 :(得分:9)
必须是:
template <class T>
void templatedFun()
{
Client<TemplatedProvider<T>::template element_template> client;
}
答案 1 :(得分:4)
您可以使用template
关键字:
template <class T>
void templatedFun()
{
Client<TemplatedProvider<T>::template element_template> client;
}
有关template
和typename
关键字的详细讨论,请参阅this question。