我们是否可以在尖括号内提及数据类型而不只是typename
和class
个关键字?
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
这样的错误任何人都可以解释我这是编译器问题还是其他任何原因
答案 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