不允许非类型参数的部分模板特化

时间:2017-11-14 11:03:30

标签: c++ templates metaprogramming template-meta-programming

以下代码不起作用,它给出了一个错误说" 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;
}

3 个答案:

答案 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
}