Накропал это я такой фрагмент:
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, с Микрософтским компилятором.
Шо делать?