このスレッド -テンプレート クラス メンバー関数のみの特殊化 から、クラス テンプレートを特殊化する場合は、すべてのメンバー関数を特殊化する必要があることを知っています。
したがって、私の理論的根拠は、テンプレート クラスを「インスタンス化」することでした。(正しい言い方かどうかは定かではありません)
次に、このインスタンス化されたクラスは本格的なクラスであるため、特定のメソッドを特殊化できます。
// I have a template class like this -
template<class T, T invalidVal, int e> class A
{
static inline bool dummy(T value)
{
return 0;
}
}
// Now I create classes from the above template class with
// T=void*, invalidVal=NULL & e=0
// And with T=void *, invalidVal=NULL & e=1
// And I typedef these classes to use them later
typedef A<void *, (void *)NULL, 0> A_0;
typedef A<void *, (void *)NULL, 1> A_1;
// So now, what I was expecting was that A_0 & A_1 are classes and
// they can have their own specialized dummy() method
// So I tried following -
inline bool A_0::dummy(void *value)
{
return value != invalidVal;
}
inline bool A_1::dummy(void *value)
{
return value == invalidVal;
}
上記のコードは Windows 環境で動作しました。(ビジュアルスタジオ 2008)
しかし、この特殊化は (g++-4.7 を使用すると) Linux では機能しません。他のいくつかのスレッドを読むことで、g++ コンパイル コマンドに -std=c++11 も渡しています。
次の2つのエラーが発生します-
1. specializing member ‘A<void*, 0u, 0>::dummy’ requires ‘template<>’ syntax
2. invalidVal was not declared in this scope
さて、エラーNo. template<>
beforeを追加すると 1 が消えてしまいinline bool A_0::dummy(void *value)
ます。専門化が思い通りに進まなかったことがわかっているので、さらに心配になります。
エラーNo. 2 消えません。
テンプレートクラスメンバー関数の特殊化についてますます混乱しています。ここで何が欠けていますか?g++ が不平を言っている理由はありますか? 何か案は?
ありがとう!