今天郁闷的碰到个错误,后来终于发现错误的原因,原因如下:
定义了一个类:
template <class V, class R, class P>
struct CAVLTreeIterator
{
public:
CAVLTreeIterator(const LinkType& pNode)
{
this->pNode = pNode;
}
}
又定义了个pair类:
template<class T1, class T2> struct Pair
{
typedef Pair<T1, T2> Self;
typedef T1 FirstType;
typedef T2 SecondType;
Pair(const FirstType& first, const SecondType& second)
{
this->first = first;
this->second = second;
}
FirstType first;
SecondType second;
};
然后定义了个新的类型Pair<CAVLTreeIterator<xxxx>, bool>,结果构造这个Pair类的时候就出错了,说没有合适的默认构造函数。
原因如下:因为在CAVLTreeIterator中我并定义了有参数的构造函数,从而替代了无参数的默认构造函数,
而在Pair的构造函数中,实际上做了2件事,先调用First和Second的无参数的默认构造函数构造实例, 再调用operator =()来进行赋值。而因为CAVLTreeIterator没有默认构造函数就出错了。
由此可知,当一个类没有默认构造函数,而有默认拷贝构造函数时必须用初始化表来进行初始化。
以下转自林锐:
示例9-2(a)中,类B的构造函数在其初始化表里调用了类A的拷贝构造函数,从而将成员对象m_a初始化。
示例9-2 (b)中,类B的构造函数在函数体内用赋值的方式将成员对象m_a初始化。我们看到的只是一条赋值语句,但实际上B的构造函数干了两件事:先暗地里创建m_a对象(调用了A的无参数构造函数),再调用类A的赋值函数,将参数a赋给m_a。
|
B::B(const A &a) : m_a(a) { … } |
B::B(const A &a) { m_a = a; … } |
示例9-2(a) 成员对象在初始化表中被初始化 示例9-2(b) 成员对象在函数体内被初始化
本文探讨了模板类构造过程中的常见问题,特别是在使用带有参数构造函数的模板类作为另一个模板类的成员时所遇到的默认构造函数缺失问题。通过具体案例分析了如何正确地初始化成员变量,并总结了初始化表在构造过程中的作用。
4677

被折叠的 条评论
为什么被折叠?



