由于更新了库,我必须将大型 c++ 程序从 VS2010 迁移到 VS2015。在VS2010中全部编译OK。VS2015的编译器现在在微软自己的atlcom.h中显示错误
我没有机会放弃 ATL 的东西,因为我的 DLL 是依赖于 ATL 的主要程序的扩展(并且在 VS2015 中编译......)。
这是 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)
错误指向atlcom.h(VS2015的编译器)的第3448行:
CComContainedObject<contained> m_contained;
CComContainedObject 的定义是 atlcom.h 的第 3277 行:
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
}
我的课是:
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();
};
有任何想法吗?你真的很受欢迎。