4

我对这段代码有问题:

#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>();
}

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

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

我究竟做错了什么?我在没有可变参数的情况下尝试了它并且它有效,但是我如何专门化可变参数模板成员函数?

4

1 回答 1

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

一条消息似乎确认这确实是一个错误。

于 2012-06-17T05:25:41.900 回答