Re: Не генерируется оператор присваивания в шаблоне класса
От: Павел Кузнецов  
Дата: 20.07.05 22:08
Оценка: 2 (1)
MicroCephalis,

>
> template <class T, class IWrappedInterface>
> class CDispinterfaceWrapper
> {
> protected:
>     void InitCallVariables();
>
> public:
>     T& operator = (const T& a_src);
>     T& operator = (const IUnknown* a_pUnk);
> };
>
> class CVideoEditWrapper : public CDispinterfaceWrapper<CVideoEditWrapper, _DVideoEdit>
> {
> public:
>     CVideoEditWrapper(){InitCallVariables();}
>     CVideoEditWrapper(const IUnknown* a_pSrc){ *this = a_pSrc;}
>     CVideoEditWrapper(const CVideoEditWrapper& a_src){ *this = a_src;}
>     virtual ~CVideoEditWrapper(){}
> }
>
> // где-то дальше
> CVideoEditWrapper vew;
> // еще дальше
> vew = <некий IUnknown*>
>

> Я ожидал, что при последнем присвоении будет использован непосредственно оператор присваивания из шаблона.

Этого не происходит, т.к. унаследованные операции присваивания, определенные в CDispinterfaceWrapper<>, скрываются операциями присваивания, неявно объявленными в классе CVideoEditWrapper.

В твоем коде есть и еще несколько неудачных моментов, среди которых использование операции присваивания *this = ... в конструкторе класса. При этом 1) переменные-члены остаются неинициализированными (в частности, похоже, отсутствует вызов InitCallVariables()); 2) operator = обычно пишется в расчете на то, что объект в левой части сконструирован, а в данном случае это не так.

> Шо делать?


Если придерживаться твоего дизайна, нужно "вручную" создать CVideoEditWrapper::operator =(CVideoEditWrapper const&) и делегирировать вызов базовому классу. С operator = (IUnknown const*) можно было бы поступить проще, написав "using CDispinterfaceWrapper<CVideoEditWrapper, _DVideoEdit>::operator =", но, т.к. VC++6, скорее всего, это переварить не в состоянии, тебе придется определить и его.


Не очень понятно, зачем, вообще, определяется класс CVideoEditWrapper вместо:
typedef CDispinterfaceWrapper<_DVideoEdit> CVideoEditWrapper;

и, соответственно, более простой реализации CDispinterfaceWrapper, с меньшим количеством хэков и ошибок...
Posted via RSDN NNTP Server 2.0 beta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.