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

Partial template specialization of non type argument not allowed

本文关键字:专用 类型参数 不允许      更新时间:2023-10-16

以下代码不起作用,它给出一个错误,说"struct foo 的模板参数太少",我不明白为什么。对我来说,代码似乎是有效的。我在"参数列表"部分的第 4 段中找到了 CPP 参考的一个片段,这可能解释了为什么它不起作用,但我不明白。

template<int a, int b, int c> struct foo { };
template<int a> struct foo<a, 0, 0> { };
int main()
{
    foo<1> f;
}
这是

允许的。但是您的模板需要 3 个参数。专用它不会神奇地将其变成 1 参数模板。

但是,您可以使其他参数具有默认参数:

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;
}

这不是模板专业化的工作方式。您必须*来指定所有参数。
*(除非您有默认参数(请参阅@StoryTeller的答案(,或者当C++17参数推导启动时,但两者都不适用于此处。

这是一个小演示:

#include <iostream>
template<int a, int b, int c> struct foo { void bar() {std::cout << "1n";} };
template<int a> struct foo<a, 0, 0> { void bar() {std::cout << "2n";} };
int main()
{
    foo<1, 2, 3> a;
    foo<4, 0, 0> b;
    a.bar(); // prints 1
    b.bar(); // prints 2
}

请注意,主模板采用 3 个模板参数。然后,您必须指定所有这些。例如

foo<1, 0, 0> f; // the partial specification is used