我们可以在函数模板定义中提到数据类型而不是typename和class关键字吗?

时间:2014-11-21 18:27:52

标签: c++

我们是否可以在尖括号内提及数据类型而不只是typenameclass个关键字?

template <typename var, int m> // why not generate the error here itself
void c(var x){
   int i = 2;
}

template void c<int, int> (int); // error: no match for any template declaration

当我不使用typename or class时,为什么编译器不会在函数模板定义中生成错误

我想不能生成错误,因为类型名匹配,var是int,m已经定义为int。仅当编译器忽略定义中的<int m>时,才可能出现错误。但是当它忽略时,为什么不简单地生成像not a valid code这样的错误任何人都可以解释我这是编译器问题还是其他任何原因

2 个答案:

答案 0 :(得分:1)

因为这是有效的 - 请阅读non-type template parameters。什么是无效的显式实例化 - 第二个参数需要是一个值,而不是一个类型。 E.g:

template void c<int, 42> (int);

答案 1 :(得分:1)

您使用一个&#34;类型&#34;定义了一个模板。参数和一个&#34;值&#34;参数。这是完全正确的,但要使用它,你必须给出一个类型和一个值(类型为int),如下所示:c<AnyType,5>(...);

在这里查看示例http://en.cppreference.com/w/cpp/language/template_parameters

这样的事情的一个例子是std :: array&lt;&gt;来自STL(在C ++ 11中) - http://en.cppreference.com/w/cpp/container/array