3

我試圖在模板類中定義模板成員。「期望初始值設定項」<'token「嘗試模板成員專業化

這裏是頭文件的片段:

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; 
} 

編譯器把我下面的錯誤:之前「<」令牌預期初始化。

我搞不​​清楚我做錯了什麼。任何幫助?

+1

我不認爲這可以這樣工作。你需要完全專門化指針類型的類。你最後一個定義的問題是'隊列'是一個不完整的類型。 – jrok

+0

@jrok是的,它似乎從一開始就有缺陷。感謝澄清。 – Kurospidey

回答

2

您應該將您的DeepCopy作爲頂層模板寫入Queue外部。只能在隊列中使用它。

template <typename T> 
    class Queue { 
     DeepCopy<T> myCopy; 
     .... 
      myCopy.doCopy(n.item, newItem); 
+0

順便說一句,你好了:) – PiotrNycz

+0

嗨。 :)我遇到了麻煩。我錯誤地理解了你以前的想法,並明顯地執行它。現在就試試吧! – Kurospidey

+0

當我回到我的電腦時,我會改進以前的答案。現在,我正在從我的移動設備上寫入信息,編寫大量代碼並不容易。 – PiotrNycz

2

爲了您的例子中,你應該

  1. 部分專攻QueueT*
  2. 部分專業化Queue<T*>結構DeepCopy的寫入定義。
  3. 編寫Queue<T*>::DeepCopy的專業化爲U*
  4. 書寫功能Queue<T*>::DeepCopy<U*>::docopy
+0

感謝您的回答。我試圖避免儘可能多的代碼重複。也許我應該嘗試PiotrNycz建議,並在Queue模板外定義DeepCopy類模板。 – Kurospidey

+0

再次嗨。在模板作爲參數之一的示例中,爲什麼您要在Queue中定義一個新的模板成員?此外,如果我想要在隊列中添加一個成員對象(DeepCopy 或DeepCopy 的對象),我該如何處理?我在理解該問題時遇到問題。 – Kurospidey

+0

@Kurospidey爲什麼對象?DeepCopy中的函數在我的例如,我在類中定義了模板結構,因爲你的例子使用了這樣的方法。我很困惑,爲什麼在你的類Queue struct DeepCopy是模板結構,並沒有使用模板參數T. – ForEveR