1

このスレッド -テンプレート クラス メンバー関数のみの特殊化 から、クラス テンプレートを特殊化する場合は、すべてのメンバー関数を特殊化する必要があることを知っています。

したがって、私の理論的根拠は、テンプレート クラスを「インスタンス化」することでした。(正しい言い方かどうかは定かではありません)

次に、このインスタンス化されたクラスは本格的なクラスであるため、特定のメソッドを特殊化できます。

// 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++ が不平を言っている理由はありますか? 何か案は?

ありがとう!

4

1 に答える 1

3

「専門化が思い通りに進まなかった」というのが何を意味するのかよくわかりません。正確には何が欲しかったのですか?

あなたのコードでは、クラス自体を特殊化せずに、テンプレート クラス メンバーの明示的な特殊化を実行しようとしています。C++ での明示的な特殊化のすべての形式には、template<>構文が必要です

template<>
inline bool A_0::dummy(void *value) 
{
  // Whatever
}

template<>
inline bool A_1::dummy(void *value)
{
  // Whatever
}

これは、C++ の場合とまったく同じです。typedef-names の背後に特殊なクラス名を「隠した」からといって、そのtemplate<>構文を使用する必要がなくなるわけではありません。

template <>Visual C++ では、非標準の拡張機能として一部をスキップできるようです。

さらに、特殊化されたバージョンは、テンプレート パラメーター名について何も認識しません (もうパラメーターはありません)。つまり、その名前invalidValは完全に認識されていません。invalidVal明示的に置き換えるかNULL(明示的な引数リストのように)、invalidVal値を定数の静的メンバーとしてクラスを介して使用できるようにします。

template<class T, T invalidVal, int e> class A
{ 
  static const T iv; // declaration
  ...
};

template <class T, T invalidVal, int e>
const T A<T, invalidVal, e>::iv = invalidVal; // definition

template <> inline bool A_0::dummy(void *value) 
{
   return value != iv;
}
于 2012-08-09T18:43:07.453 に答える