函数的嵌套模板参数

时间:2016-05-12 10:09:14

标签: 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中的函数采用两个模板参数而没有任何默认值,但是在主调用中只提供了一个参数。

EDIT2:  我想要模板化的foo2类的另一个func2重载,我已经在我的代码中定义了。

template <typename T>
T func2(){
}

1 个答案:

答案 0 :(得分:4)

模板模板参数在函数体中定义模板名称。您必须提供参数来实例化它们。这意味着{/ 1}}

T

在其他地方不可见;只有模板名称template <template <typename T> class foo2> void func2(foo2<T>); 是。

你的第一个样本,

foo2

有效,因为T是顶级模板类型参数,即

  1. 对函数体可见,
  2. 从函数参数推断出来。
  3. 但是,使用简单的模板类型参数和直接使用类template <typename T, template <typename> class foo2> void func2(foo2<T>); 更容易编写此用例:

    foo2

    有关详细信息,请参阅cppreference上的template parameters and template arguments

    注意,在我写完上面的内容之后编辑了这个问题,并且该类型不再用作函数参数。关于类型演绎的观点不再适用,但答案的其余部分仍然存在。