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

私は何を間違っていますか?variadicnessなしで試してみましたが、うまくいきましたが、variadicテンプレートメンバー関数を特殊化するにはどうすればよいですか?

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()'のtemplate-id'stuff2'がどのテンプレート宣言とも一致しません

関連するSOの質問があります。

これが確かにバグであることを確認するメッセージのようです

于 2012-06-17T05:25:41.900 に答える