2015-11-17 24 views
6

バリデーションテンプレートを使用してテンプレート化されているメンバ関数の特殊化には苦労しています。バリデーションテンプレートメンバ関数の部分的な特殊化

次の例では、クラス全体を専門とし、それが正常に動作します:

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 

とにかく、縮小された例は実際のものと似ています。私は、エラーが完全に無関係ではないと思います。

+2

機能テンプレートを部分的に特殊化することはできません。 –

+0

*メンバー関数テンプレート*を意味しますか? – skypjack

+0

@skypjack:メンバーでメンバーではありません。 – Jarod42

答えて

12

機能テンプレートを部分的に特化することはできません。明示的な特殊化のみが許可されます。

特に、tag dispatchingなどの概念を使用すると、オーバーロードを使用して同じ効果を得ることができます。

+0

良いヒント。私はすでにタグのディスパッチを使用していますが、それは私の心には今日来なかった!ありがとうございました。 – skypjack

関連する問題