c++ - 函数的嵌套模板参数

标签 c++ templates c++11 metaprogramming

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 是顶级模板类型参数,即

  1. 对函数体可见,并且
  2. 从函数参数中推导出来。

但是,使用简单的模板类型参数和直接使用类 foo2 更容易编写此用例:

template <typename T> void func2(foo2<T>);

参见,例如,template parameters and template arguments关于 cppreference 的详细信息


注意,问题是我写完上面后编辑的,类型不再用作函数参数。关于类型推导的观点不再适用,但答案的其余部分仍然有效。

关于c++ - 函数的嵌套模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37183743/

相关文章:

c++ - 在类中使用不同的模板参数

C++ 约束 enable_if 与 requires

c++ - 将 std::vector<std::shared_ptr<T>> 转换为 std::vector<std::shared_ptr<const T>>

c++ - 如何在 c++ 中没有数组/算法的情况下在两个条件下对字符串进行排序?

C++:函数重新声明是未定义的行为吗?

c++ - C++模板中的隐式类型转换

c++ - 如何搜索和打印字符串中的特定部分?

c++ - 为什么 std::invoke 不处理函数重载

c++ - 模板函数中的 "C4430: missing type specifier - int assumed"

linux - 是否可以仅针对某些特定的 C++11 代码段 {activate|de-activate} SIGFPE 生成?