バリデーションテンプレートを使用してテンプレート化されているメンバ関数の特殊化には苦労しています。バリデーションテンプレートメンバ関数の部分的な特殊化
次の例では、クラス全体を専門とし、それが正常に動作します:
template<typename... Args>
class C;
template<class T, typename... Args>
class C<T, Args...> { };
template<>
class C<> { };
int main() {
C<int, double> c{};
}
次1は、その背後にある考え方は、上記1のと全く同じであっても、していません。
class F {
template<typename... Args>
void f();
};
template<class T, typename... Args>
void F::f<T, Args...>() { }
int main() {
}
次のエラーが発生しました。原因はわかりません。
main.cpp:7:23: error: non-type partial specialization ‘f<T, Args ...>’ is not allowed
void F::f<T, Args...>() { }
^
main.cpp:7:6: error: prototype for ‘void F::f()’ does not match any in class ‘F’
void F::f<T, Args...>() { }
^
main.cpp:3:10: error: candidate is: template<class ... Args> void F::f()
void f();
^
関数テンプレートを特殊化するときに気づいていない制約がいくつかありますか?
G ++のバージョンは次のとおりです。グラム++(Debianの5.2.1-23)ところで5.2.1 20151028
EDIT
、私は本当から取得しています実際の問題コードは:
non-class, non-variable partial specialization ‘executeCommand<T, Args ...>’ is not allowed
とにかく、縮小された例は実際のものと似ています。私は、エラーが完全に無関係ではないと思います。
機能テンプレートを部分的に特殊化することはできません。 –
*メンバー関数テンプレート*を意味しますか? – skypjack
@skypjack:メンバーでメンバーではありません。 – Jarod42