首先,我为更长的示例代码和问题道歉...有三个类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)在哪里(在哪些类中)实现析构函数。
非常感谢你的帮助。
答案 0 :(得分:1)
问题在于你无法比较不同类型的指针。您应该删除this != &source
行,因为不同类型的对象无论如何都不相等,并为td == td2
情况实现另一个适当的复制构造函数。
template <const TD td2>
B (const B<Item*, td2>& source)
{
// code
}
B (const B& source)
{
// code
}
答案 1 :(得分:1)
B&lt; ...,D1&gt;和B&lt; ...,D2&gt;是完全不同的类,你不能将一个复制到另一个。 如果你真的想复制B&lt; ...,D1&gt;,也许你应该写一个模板复制功能。对象进入B&lt; .. l。,D2&gt;对象。