专门研究非模板类的可变参数模板成员函数

时间:2012-06-17 03:18:22

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

我遇到了这段代码的问题:

#include <iostream>

using namespace std;

class A {
public:
        template<typename T, typename... Args>
        void stuff(Args... args);
};

template<typename T, typename... Args>
void A::stuff(Args... args) {
        cout << sizeof...(args) << endl;
}

template<>
void A::stuff<int>() {
        cout << "int" << endl;
}

int main() {
        A a;
        A b;

        a.stuff<char>();
        b.stuff<int>();
}

Trying to compile it,我收到此错误:

template-id 'stuff<int>' for 'void A::stuff()' does not match any template declaration

我做错了什么?我尝试了它没有variadicness它工作,但我如何专门化可变参数模板成员函数?

1 个答案:

答案 0 :(得分:5)

这看起来像个错误。问题不仅限于完全专用的成员函数模板。即使使用免费功能模板也可以复制,如下所示:

template<typename T, typename... Args>
void stuff2(Args... args);

template<typename T, typename... Args>
void stuff2(Args... args) {
    cout << sizeof...(args) << endl;
}

template<>
void stuff2<int>() {
    cout << "int" << endl;
}
int main() {}

虽然clang 3.2编译得很好,但gcc抱怨:

  

spec.cpp:31:6:错误:'void stuff2()'的模板ID'stuff2'没有    匹配任何模板声明

有一个相关的SO question

message似乎证实这确实是一个错误。