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

Set*_*gie 4 c++ templates variadic-templates c++11

我遇到这个代码的问题:

#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>();
}
Run Code Online (Sandbox Code Playgroud)

试图编译它,我得到这个错误:

template-id 'stuff<int>' for 'void A::stuff()' does not match any template declaration
Run Code Online (Sandbox Code Playgroud)

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

dir*_*tly 5

这看起来像一个bug.问题不仅限于完全专用的成员函数模板.即使使用自由功能模板也可以重现它,如下所示:

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() {}
Run Code Online (Sandbox Code Playgroud)

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

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

有一个相关的SO问题.

一条消息似乎证实这确实是一个错误.