如何解决将 vc2010 迁移到 vc2015 Visual studio 时出现错误 C2259

问题描述 投票:0回答:1

将 2010 Visual Studio 迁移到 2015 Visual Studio 时遇到问题。 任何帮助将不胜感激。 注意:此模块中的任何地方均未使用 IAxWinAmbientDispatch 或 CAxHostWindow。 当我在此遗留应用程序的任何项目中包含“atlctl.h”时,出现同样的错误。

class ATL_NO_VTABLE CWebHostCls :
    public CComObjectRootEx<CComSingleThreadModel>,
    public CComCoClass<CWebHostCls , &CLSID_WEBDialog>,
    public IDispatchImpl<ICWebHostCls , &IID_ICWebHostCls, &LIBID_WEBHOST>,
    public IObjectSafetyImpl<CWebHostCls , INTERFACESAFE_FOR_UNTRUSTED_CALLER>,
#ifndef _ATL_NO_DOCHOSTUIHANDLER
    public IDocHostUIHandler
#endif

> "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\atlmfc\include\atlcom.h(3578): 
> error C2259: 'ATL::CComContainedObject<contained>': cannot instantiate abstract class
> with
> [
> contained=ATL::CAxHostWindow
>  ]"
> "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\atlmfc\include\atlcom.h(3578): note: due to following members:
> C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\atlmfc\include\atlcom.h(3578): note: 'HRESULT IAxWinAmbientDispatch::put_AllowWindowlessActivation(VARIANT_BOOL)': is abstract
> C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\atlmfc\include\atliface.h(1501): note: see declaration of 'IAxWinAmbientDispatch::put_AllowWindowlessActivation'
> C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\atlmfc\include\atlcom.h(3578): note: 'HRESULT IAxWinAmbientDispatch::get_AllowWindowlessActivation(VARIANT_BOOL *)': is abstract"
> 
> ```
mfc atl
1个回答
0
投票

包含此代码片段的通用头文件是此问题的根本原因。 类 SafeVariantBool { 民众: 隐式 SafeVariantBool(短 bVariant = VARIANT_FALSE) { 运算符=(bVariant); } 隐式 SafeVariantBool(bool bVariant) { 运算符=(bVariant); }

    //  required because of ATL defines for ATL_VARIANT_TRUE / ATL_VARIANT_FALSE
    //  and to allow default values in IDL
    implicit SafeVariantBool(int bVariant)
        { operator=(static_cast<short>(bVariant)); }

    SafeVariantBool operator=(short bVariant)
        {
            ASSERT(bVariant == VARIANT_TRUE || bVariant == VARIANT_FALSE);
            _bVariant = bVariant;
            return *this;
        }
    SafeVariantBool operator=(bool bVariant)
        { return operator=(bVariant ? VARIANT_TRUE : VARIANT_FALSE); }
    operator short() const
        { return _bVariant; }
    bool get() const
        { return _bVariant != VARIANT_FALSE; }
    short* GetAddress()
        { return &_bVariant; }

private:
    short   _bVariant;
};

#define VARIANT_BOOL    SafeVariantBool
#define false           (!true)
© www.soinside.com 2019 - 2024. All rights reserved.