如何为模板类编写复制构造函数。因此,如果模板参数是另一个用户定义的类,那么它的复制构造函数也会被调用。
以下是我的班级
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 :(得分: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)
{
//..
}
//..
};
但我认为你不需要明确定义复制构造函数,除非该类具有指针成员数据并且你想要对这些对象进行深层复制。如果您没有指针成员数据,那么编译器生成的默认复制构造函数就足够了。