如何编写Template类复制构造函数

时间:2011-10-03 17:09:52

标签: c++ templates copy-constructor

如何为模板类编写复制构造函数。因此,如果模板参数是另一个用户定义的类,那么它的复制构造函数也会被调用。

以下是我的班级

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

3 个答案:

答案 0 :(得分:4)

要么a)根本没有,只要依赖编译器提供的默认值;或b)只需调用成员的复制构造函数:

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

关键在于编译器提供的默认复制构造函数完全相同:它逐个调用每个成员的复制构造函数。因此,对于由聪明的成员对象组成的类,默认的复制构造函数应该是最好的。

答案 1 :(得分:3)

假设_TyV是值类型:

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

顺便说一下,实现是否保留了类实例中的那些名称?

  

C ++标准保留了一组供C ++实现和标准库使用的名称[C ++标准17.6.3.3 - 保留名称]。这些包括但不限于:

     
      
  • 包含双下划线的名称。
  •   
  • 以下划线开头,后跟大写字母的名称。
  •   
  • 以全局命名空间中的下划线开头的名称。
  •   

答案 2 :(得分: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)
    {
      //..
    }
    //..
};

但我认为你不需要明确定义复制构造函数,除非该类具有指针成员数据并且你想要对这些对象进行深层复制。如果您没有指针成员数据,那么编译器生成的默认复制构造函数就足够了。