3

テンプレートクラス内にテンプレートメンバーを定義しようとしています。

ヘッダーファイルのフラグメントは次のとおりです。

template <typename Type>
class Queue
{
private:
// class scope definitions
    // Node is a nested structure definition local to this class
    struct Node {Type item; struct Node* next;};
    enum {Q_SIZE = 10};
    template <typename Type2> class DeepCopy // template member
    {
    public:
        void docopy(Type2& d, const Type2& s);
    };
...

したがって、テンプレートメンバーは定義されていますが、docopyメソッドを明示的に特殊化して、型がポインターの場合にディープコピーするようにします。メソッドテンプレートと特殊化を使用して、ヘッダーファイルから別のフラグメントを配置します。

// template member
template <typename Type>
    template <typename Type2>
void Queue<Type>::DeepCopy<Type2>::docopy(Type2& d, const Type2& s)
{
    d = s;
}

// template member specialization for pointers
template <typename Type>
    template <typename Type2>
void Queue<Type*>::DeepCopy<Type2*>::docopy(Type2* d, const Type2* s)
{
    if (s)
        d = new (*s);
    else
        d = 0;
}

コンパイラは次のエラーを送信します:'<'トークンの前に初期化子が必要です。

何が間違っているのか理解できません。何か助けはありますか?

4

2 に答える 2

2

あなたの例では、

  1. の部分的な専門QueueクラスT*
  2. Queue<T*>構造体の書き込み定義の部分的な特殊化DeepCopy
  3. Queue<T*>::DeepCopyforのスペシャライゼーションを記述しU*ます。
  4. 書き込み関数Queue<T*>::DeepCopy<U*>::docopy
于 2012-09-09T12:37:59.623 に答える
2

DeepCopyをキューの外部にトップレベルのテンプレートとして作成する必要があります。キュー内でのみ使用してください。

   template <typename T>
   class Queue { 
      DeepCopy<T> myCopy;
      ....
          myCopy.doCopy(n.item, newItem);
于 2012-09-09T12:50:43.863 に答える