以下代码不起作用,它给出了一个错误说" struct foo"模板参数太少而且我不明白为什么。对我来说,似乎代码应该是有效的。我在章节"参数列表",第4段中找到了CPP参考here的摘要,这可能解释了为什么它不起作用但我不理解。
template<int a, int b, int c> struct foo { };
template<int a> struct foo<a, 0, 0> { };
int main()
{
foo<1> f;
}
答案 0 :(得分:4)
允许。但是你的模板需要3个参数。专业化它并没有神奇地把它变成一个参数模板。
但是,您可以使其他参数具有默认参数:
template<int a, int b = 0, int c = 0> struct foo { char _[1] ; };
template<int a> struct foo<a, 0, 0> { char _[10] ;};
int main() {
static_assert(sizeof(foo<1>) > sizeof(foo<1, 1, 1>), "");
return 0;
}
答案 1 :(得分:1)
请注意,主模板需要3个模板参数。然后你必须指定所有这些。 e.g。
foo<1, 0, 0> f; // the partial specification is used
答案 2 :(得分:1)
不是模板专业化的工作方式。你有*来指定所有参数 *(除非你有默认参数(参见@ThisTeller的答案),或者当C ++ 17参数演绎开始时,但两者都不适用于此处。 )子>
这是一个小型演示:
#include <iostream>
template<int a, int b, int c> struct foo { void bar() {std::cout << "1\n";} };
template<int a> struct foo<a, 0, 0> { void bar() {std::cout << "2\n";} };
int main()
{
foo<1, 2, 3> a;
foo<4, 0, 0> b;
a.bar(); // prints 1
b.bar(); // prints 2
}