【发布时间】:2012-02-15 18:23:05
【问题描述】:
首先,我为稍长的示例代码和问题道歉……共有三个类 A、B、C(其中 A 和 B 是抽象的)。
A 类表示一个容器,用于存储不同类型的 Item 对象。
template <typename Item>
struct TList {typedef std::vector <Item> Type;};
template <typename Item>
class A
{
protected: typename TList <Item>::Type items;
A() : items ( 0 ) {}
virtual ~A() = 0 {}
};
派生类 B 包含具有一些附加功能的 Item* 特化,并具有 TD 的默认参数。
typedef enum { D1, D2} TD;
template < typename T, const TD td = D1 >
class B;
template <typename Item, const TD td>
class B <Item *, td> : public A <Item *>
{
public:
B () : A <Item *> () {}
template <const TD td2>
B ( const B <Item *, td2> & source )
{
if ( this != &source ) { //Code } //Error
}
virtual ~B() = 0 {}
};
C 类不是抽象的,它包含另一个附加功能(未包含在代码中)。
template < typename T, const TD td = D1 >
class C;
template <typename Item, const TD td>
class C <Item *, td> : public B <Item *, td>
{
public:
C() : B <Item *, td> () {}
template <const TD td2>
C ( const C <Item*, td2 > &source ) : B <Item*, td> ( source ) {}
};
如果我试图创建 C 类的两个对象。如果默认参数是类型,那么一切正常。
int main()
{
C <Test <double> *, D1 > t1;
C <Test <double> *, D1 > t2(t1);
}
但如果两个参数的类型不同
int main()
{
C <Test <double> *, D1 > t1;
C <Test <double> *, D2 > t2(t1);
}
编译器停在行
if ( this != &source ) { //Code } //Error
出现以下错误:
Error 1 error C2446: '!=' : no conversion from 'const B<T,td> *' to 'B<T,td> *const
我对代码的问题:
1)在哪里(在哪些类中)以及如何为TD的不同模式实现复制构造函数。
2) TD的不同参数在哪里(在哪些类中)以及如何实现operator =。
3) 在哪里(在哪些类中)实现析构函数。
非常感谢您的帮助。
【问题讨论】:
标签: c++ templates default-value copy-constructor