Не генерируется оператор присваивания в шаблоне класса
От: MicroCephalis Россия  
Дата: 20.07.05 21:04
Оценка:
Накропал это я такой фрагмент:


template <class T, class IWrappedInterface>
class CDispinterfaceWrapper  
{
protected:
    CComQIPtr<IWrappedInterface> m_Wrapped;

    void InitCallVariables();
    {
        // разное
    }


public:
    T& operator = (const T& a_src)
    {
        InitCallVariables();
        m_Wrapped = a_src.m_Wrapped;
        return (T&)*this;
    }

    T& operator = (const IUnknown* a_pUnk)
    {
        InitCallVariables();
        m_Wrapped = a_pUnk;
        return (T&)*this;
    }
};

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*>


Я ожидал, что при последнем присвоении будет использован непосредственно оператор присваивания из шаблона. На деле имеет место следующее: для правой части (IUnknown) компилятор сначала вызывает неявный конструктор от IUnk* (с целью, видимо, впоследствии использовать полученный объект в операторе копирования), в этом конструкторе имеет место такое же присвоение (справа IUnk*), так что снова вызывается неявный конструктор, и спустя малое время приходит stack overflow.

При этом попытка поставть breakpoint на оператор T& operator = (const IUnknown* a_pUnk) показывает, что он вообще не скомпилировался!

Если же сделать в CVideoEditWrapper'е конструктор от IUnk* типа "explicit", то при компиляции в нем вылезает ошибка "не определен оператор, принимающий в правой части const IUnk*", а оператор присваивания в шаблоне все равно не компилится.

Все эти танцы с бубном происходят в VC++ 6.0, с Микрософтским компилятором.

Шо делать?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.