C ++, реализация конструктора копирования, параметры шаблонов по умолчанию - PullRequest
1 голос
/ 21 января 2012

Сначала я прошу прощения за несколько более длинный пример кода и вопрос ... Есть три класса A, B, C (где A и B являются абстрактными).

Класс A представляет контейнер, хранящий объектыразные типы предметов.

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) Где (в каких классах) и как реализовать оператор= для разных патаметеров ТД.

3) Где (в каких классах) реализовать деструктор.

Большое спасибо за помощь.

Ответы [ 2 ]

1 голос
/ 21 января 2012

B <..., D1> и B <..., D2> - совершенно разные классы, вы не можете копировать один в другой.Возможно, вам следует написать шаблонную функцию копирования, если вы действительно хотите копировать объекты B <..., D1> в объекты B <.. l., D2>.

1 голос
/ 21 января 2012

Проблема в том, что вы не можете сравнивать указатели разных типов.Вы должны удалить строку this != &source, так как объекты разных типов предположительно не равны, и реализовать другой правильный конструктор копирования для случая td == td2.

template <const TD td2>
B (const B<Item*, td2>& source)
{
    // code
}

B (const B& source)
{
    // code
}
...