C ++,复制构造函数实现,默认模板参数

时间:2012-01-21 15:17:04

标签: c++ templates default-value copy-constructor

首先,我为更长的示例代码和问题道歉...有三个类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)在哪里(在哪些类中)实现析构函数。

非常感谢你的帮助。

2 个答案:

答案 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;对象。