Сначала я прошу прощения за несколько более длинный пример кода и вопрос ... Есть три класса 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) Где (в каких классах) реализовать деструктор.
Большое спасибо за помощь.