2011-10-03 51 views
5

如何編寫模板類的拷貝構造函數。所以如果模板參數是另一個用戶定義的類,它的拷貝構造函數也被調用。如何寫模板類拷貝構造函數

以下是我的課

template <typename _TyV> 
class Vertex { 
public: 
    Vertex(_TyV in) : m_Label(in){ } 
    ~Vertex() { } 
    bool operator < (const Vertex & right) const { 
     return m_Label < right.m_Label; 
    } 

    bool operator == (const Vertex & right) const { 
     return m_Label == right.m_Label; 
    } 

    friend std::ostream& operator << (std::ostream& os, const Vertex& vertex) { 
     return os << vertex.m_Label;  
    } 

    _TyV getLabel() { return m_Label;} 
private: 
    _TyV m_Label; 
public: 
    VertexColor m_Color; 
protected: 
}; 
+0

你想擁有可以接受任何'class'作爲參數的拷貝構造函數嗎? – iammilind

+2

@iammilind:那不會是複製構造函數。 –

回答

3

假設_TyV是值類型:

Vertex(Vertex const& src) 
    : m_Label(src.m_Label) 
{} 

不被執行保留類實例中的那些名字,順便說一下?

C++標準爲C++實現和標準庫保留了一組名稱[C++標準17.6.3.3 - 保留名稱]。這些包括但不限於:

  • 包含雙下劃線的名稱。
  • 以下劃線後跟大寫字母開頭的名稱。
  • 在全局名稱空間處以下劃線開頭的名稱。
+0

謝謝你會解決這個問題。 – Avinash

+0

如果_TyV是指針或引用,那麼該怎麼辦 – Avinash

+0

@Avinash:它會工作得很好,我不知道我爲什麼寫這個。將解決。 –

2
template <typename T> 
class Vertex { 
public: 

    //this is copy-constructor 
    Vertex(const Vertex<T> &other) 
      : m_Color(other.m_Color),m_Label(other.m_Label) 
    { 
     //.. 
    } 
    //.. 
}; 

但我不認爲你需要明確定義拷貝構造函數,除非類有指針會員數據,並要進行深孔對象的副本。如果您沒有指針成員數據,那麼由編譯器生成的默認複製構造函數就足夠了。

+0

我不知道這個班將如何使用。我想使它通用。 – Avinash

4

要麼a)完全不依賴於編譯器提供的默認值;或b)由剛調用成員的拷貝構造函數:

template <typename T> struct Foo 
{ 
    T var; 
    Foo(const Foo & rhs) : var(rhs.var) { } 
}; 

的一點當然是編譯器提供的默認拷貝構造函數正是同樣的事情:它調用一個每個成員一個拷貝構造函數。所以對於由聰明的成員對象組成的類,默認的拷貝構造函數應該是最好的。

+0

看到你的回答後,我明白了這個問題。 :) – iammilind

+0

您也可以顯式默認C++ 0x中的複製構造函數。此外,這將'CopyConstructible'要求放在你的模板參數上。 – pmr