user12020907
user12020907

Reputation: 11

atlcom.h:3448: Error: C2259: 'ATL::CComContainedObject<contained>'

Due to an updated library I have to migrate a large c++ program from VS2010 to VS2015. In VS2010 all compiled OK. The compiler of VS2015 now shows an error in Microsofts own atlcom.h

I have no chance to abandon the ATL stuff as my DLL is an extension to a major progam which relies on ATL (and is compiled in VS2015…).

This is the error message of cl 2015:

C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\atlmfc\include\atlcom.h(3448): error C2259: 'ATL::CComContainedObject<contained>': cannot instantiate abstract class
        with[ T=CMyReferenceDat ]
...\atlcom.h(3448): note: due to following members:
...\atlcom.h(3448): note: 'HRESULT IZEDOInteractionCallback::OnPostUISizeboxEdit(IZElement *,VARIANT_BOOL *)': is abstract
...\icapiironcad.tlh(11979): note: see declaration of 'IZEDOInteractionCallback::OnPostUISizeboxEdit':

      virtual HRESULT __stdcall OnPostUISizeboxEdit (
        /*[in]*/ struct IZElement * piElement,
        /*[in,out]*/ VARIANT_BOOL * pvbOverride ) = 0;

...\atlcom.h(2000): note: see reference to class template instantiation 'ATL::CComAggObject<T>' being compiled
        with[ T=CMyReferenceDat ]

...\atlcom.h(1989): note: while compiling class template member function 'HRESULT ATL::CComCreator<ATL::CComAggObject<T>>::CreateInstance(void *,const IID &,LPVOID *)'
        with[ T=CMyReferenceDat ]   

...\atlcom.h(2094): note: see reference to function template instantiation 'HRESULT ATL::CComCreator<ATL::CComAggObject<T>>::CreateInstance(void *,const IID &,LPVOID *)' being compiled
        with[ T=CMyReferenceDat ]

...\atlcom.h(2096): note: see reference to class template instantiation 'ATL::CComCreator<ATL::CComAggObject<T>>' being compiled
        with[ T=CMyReferenceDat ]

...\atlcom.h(2091): note: while compiling class template member function 'HRESULT ATL::CComCreator2<ATL::CComCreator<ATL::CComObject<T>>,ATL::CComCreator<ATL::CComAggObject<T>>>::CreateInstance(void *,const IID &,LPVOID *)'
        with[ T=CMyReferenceDat ]   

...\QuickConnector.cpp(30): note: see reference to function template instantiation 'HRESULT ATL::CComCreator2<ATL::CComCreator<ATL::CComObject<T>>,ATL::CComCreator<ATL::CComAggObject<T>>>::CreateInstance(void *,const IID &,LPVOID *)' being compiled
        with[ T=CMyReferenceDat ]

...\QuickConnector.cpp(29): note: see reference to class template instantiation 'ATL::CComCreator2<ATL::CComCreator<ATL::CComObject<T>>,ATL::CComCreator<ATL::CComAggObject<T>>>' being compiled
        with[ T=CMyReferenceDat ]

jom: ...\QuickConnector\Makefile [QuickConnector.obj] Error 2
jom: ...\src_abgeruestet2\debug\Makefile [sub-QuickConnector-make_first] Error 2
16:25:39: Der Prozess "C:\Users\Andreas4\msvc_make.bat" wurde mit dem Rückgabewert 2 beendet.
Fehler beim Erstellen/Deployment des Projekts qc (Kit: Qt 5.6.3 64bit mit VS 2015)

The error points to line 3448 of atlcom.h (compiler of VS2015):

CComContainedObject<contained> m_contained;

The definition of CComContainedObject is Line 3277 of atlcom.h:

template <class Base> //Base must be derived from CComObjectRoot
class CComContainedObject : public Base
{
public:
    typedef Base _BaseClass;
    CComContainedObject(_In_opt_ void* pv) 
    {
        m_pOuterUnknown = (IUnknown*)pv;
    }
    // some additional members
}

My class is:

class ATL_NO_VTABLE CMyReferenceData :

        public CQcEdoBase,
        public IQcEdoReferenceData,
        public IPersistStream,
        public IZEDORenderCallback,
        public IZEDOInteractionCallback,
        public IZEDOSelectionCallback,
        public CComCoClass<CMyReferenceData, &CLSID_CMyReferenceData>
{
    UniqueIDType id;
    QMutex PopupMenuMutex;
    static bool DrawHUDElements;
    static QHash<UniqueIDType, UniqueIDType> loadedElementIdDict;

public:
    CMyReferenceData();

    DECLARE_REGISTRY_RESOURCEID(IDR_QCEDOREFERENCEDATA)
    DECLARE_PROTECT_FINAL_CONSTRUCT()

    BEGIN_COM_MAP(CMyReferenceData)
    COM_INTERFACE_ENTRY(IQcEdoReferenceData)
    COM_INTERFACE_ENTRY_CHAIN(CQcEdoBase)
    COM_INTERFACE_ENTRY(IPersistStream)
    COM_INTERFACE_ENTRY(IZEDOInteractionCallback)
    COM_INTERFACE_ENTRY(IZEDORenderCallback)
    COM_INTERFACE_ENTRY(IZEDOSelectionCallback)
    END_COM_MAP();

    // IEDOText
    STDMETHOD(get_ID)(/*[out, retval]*/ unsigned long long *pVal);
    STDMETHOD(put_ID)(/*[in]*/ unsigned long long newVal);

    // IZEDOInteractionCallback
    STDMETHOD(OnMenuCommand)(IZElement * piElement, long Id);
    STDMETHOD(OnPopupMenu)(IZElement * piElement, LONG_PTR HWND, LONG clientX, LONG clientY, eZSubSelectionType SelectionType, IZMenu* piMenu, VARIANT_BOOL * bOverride);

    // IPersistStream
    STDMETHOD(GetClassID) ( LPCLSID lpClassID) ;
    STDMETHOD(IsDirty)( void);
    STDMETHOD(Load)(IStream *pStm);
    STDMETHOD(Save)(IStream *pStm, BOOL fClearDirty);
    STDMETHOD(GetSizeMax)(ULARGE_INTEGER *pcbSize);

    // IZEDORenderCallback
    STDMETHOD(OnDraw)(IZElement * piElement, IZRender * piRender, VARIANT_BOOL * bOverride);
    STDMETHOD(OnHotDraw)(IZElement * piElement, IZRender * piRender, VARIANT_BOOL * bOverride);
    STDMETHOD(OnDrawAccessories)(IZElement * piElement, IZRender * piRender, VARIANT_BOOL * bOverride);

    // IZEDOSelectionCallback
    STDMETHOD(OnDeselect)(IZElement* piElement, VARIANT_BOOL* pOverride);
    STDMETHOD(OnSelect)(IZElement* piElement, VARIANT_BOOL* pOverride);

    // Standard c++
    static bool DisplayHUD();
    static bool ToggleDisplayHUD();
    static void SetDisplayHUDEnabled(bool yes);

    static void ClearElementIdDict();
};

Any ideas? You are really welcome.

Upvotes: 1

Views: 1331

Answers (0)

Related Questions