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 中的函数采用两个没有任何默认值的模板参数,但是在 main 中的调用仅提供一个参数。
编辑2: 我想要模板化的 foo2 类的另一个 func2 重载,我已经在我的代码中定义了。
template <typename T>
T func2(){
}
最佳答案
Template 模板参数在函数体中定义一个模板名称。您必须提供参数来实例化它们。这意味着 T
在
template <template <typename T> class foo2> void func2(foo2<T>);
在别处不可见;只有模板名称 foo2
是。
你的第一个样本,
template <typename T, template <typename> class foo2> void func2(foo2<T>);
之所以有效,是因为 T 是顶级模板类型参数,即
- 对函数体可见,并且
- 从函数参数中推导出来。
但是,使用简单的模板类型参数和直接使用类 foo2
更容易编写此用例:
template <typename T> void func2(foo2<T>);
参见,例如,template parameters and template arguments关于 cppreference 的详细信息
注意,问题是我写完上面后编辑的,类型不再用作函数参数。关于类型推导的观点不再适用,但答案的其余部分仍然有效。
关于c++ - 函数的嵌套模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37183743/