template <typename T> class foo2 {
};
样本1
template <typename T, template <typename> class foo2>
foo2<T> func2(){
}
样本2
template <template <typename T> class foo2>
foo2<T> func2(){
}
我有一个模板类,我想编写一个只接受该类的函数(当然还有任何一个模板) 为什么样本1有效,2有无效?
编辑:
请说明匹配是如何发生的?显然,样本1中的函数采用两个模板参数而没有任何默认值,但是在主调用中只提供了一个参数。
EDIT2: 我想要模板化的foo2类的另一个func2重载,我已经在我的代码中定义了。
template <typename T>
T func2(){
}
答案 0 :(得分:4)
模板模板参数在函数体中定义模板名称。您必须提供参数来实例化它们。这意味着{/ 1}}
T
在其他地方不可见;只有模板名称template <template <typename T> class foo2> void func2(foo2<T>);
是。
你的第一个样本,
foo2
有效,因为T是顶级模板类型参数,即
但是,使用简单的模板类型参数和直接使用类template <typename T, template <typename> class foo2> void func2(foo2<T>);
更容易编写此用例:
foo2
有关详细信息,请参阅cppreference上的template parameters and template arguments
注意,在我写完上面的内容之后编辑了这个问题,并且该类型不再用作函数参数。关于类型演绎的观点不再适用,但答案的其余部分仍然存在。