繁体   English   中英

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

[英]Partial template specialization of non type argument not allowed

以下代码不起作用,它给出错误消息:“ struct foo的模板参数太少”,我不明白为什么。 在我看来,该代码应该是有效的。 我发现从CPP参考片段这里参见“参数列表”,第4段这或许可以解释为什么它不工作,但我不明白。

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

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

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

模板专业化不是这样工作的。 您必须*指定所有参数。
*(除非您具有默认参数 (请参见@StoryTeller的答案),或者当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
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM