【问题标题】:Template specialization with variadic templates具有可变参数模板的模板专业化
【发布时间】:2011-12-07 16:58:58
【问题描述】:
template <size_t size, typename ...Params>
void doStuff(Params...) {
}

template <>
void doStuff<size_t(1), int, bool>(int, bool) {

}

int main(int, char**) {
    doStuff<1,int,bool>(1, false);
    return 0;
}

这不会编译,第二个 doStuff 声明给了我error: template-id ‘doStuff&lt;1u, int, bool&gt;’ for ‘void doStuff(int, bool)’ does not match any template declaration,但它显然匹配第一个声明和可变参数模板参数。

如何特化可变参数模板?

【问题讨论】:

    标签: c++ templates c++11 template-specialization variadic-templates


    【解决方案1】:

    语法是正确的(afaik,clang++ 接受它),但你的编译器可能还不是 up2date。

    如果你使用 gcc,它的可变参数模板支持是相当不完整的,甚至最近的 svn 版本还不支持专业化(这正是你使用前沿技术时的情况,遗憾的是 gcc 只实现了很早不完整的可变参数模板提案,从那时起就没有跟上多少,而 clang 开始得很晚,但已经很完整了)

    【讨论】:

    • 我使用 gcc 4.5.2。感谢您的回答(我现在改用模板重载)。
    • 或者,您可以将函数包装在 template&lt;..&gt; struct Do { static void Stuff(..) { } }; 中。
    • @coyotte508:这可能是函数模板的最佳选择,甚至有人说函数模板专业化总是错误的......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-31
    • 1970-01-01
    • 1970-01-01
    • 2014-04-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多