首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >错误C2664:无法将参数2从“const ATL::CAdapt<ATL::CComPtr<IZipFileEntry>> *”转换为“ATL::CAdapt<ATL::CComPtr<IZipFileEntry>>*”

错误C2664:无法将参数2从“const ATL::CAdapt<ATL::CComPtr<IZipFileEntry>> *”转换为“ATL::CAdapt<ATL::CComPtr<IZipFileEntry>>*”
EN

Stack Overflow用户
提问于 2014-04-02 09:17:12
回答 1查看 2.1K关注 0票数 1

我正在将VS2008(VC++)代码迁移到VS2013。我得到以下错误:

代码语言:javascript
复制
error C2664: 'HRESULT _CopyItfFromAdaptItf<IZipFileEntry>::copy(T **,ATL::CAdapt<ATL::CComPtr<T>> *)' : cannot convert argument 2 from 'const ATL::CAdapt<ATL::CComPtr<IZipFileEntry>> *' to 'ATL::CAdapt<ATL::CComPtr<IZipFileEntry>> *'

此错误出现在文件中,如何实现?我无法修复这个错误。请在下面的输出和错误行下面找到。

非常感谢您的帮助!!

输出:

代码语言:javascript
复制
C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\atlmfc\include\atlcom.h(5818): error C2664: 'HRESULT _CopyItfFromAdaptItf<IZipFileEntry>::copy(T **,ATL::CAdapt<ATL::CComPtr<T>> *)' : cannot convert argument 2 from 'const ATL::CAdapt<ATL::CComPtr<IZipFileEntry>> *' to 'ATL::CAdapt<ATL::CComPtr<IZipFileEntry>> *'
      with
      [
          T=IZipFileEntry
      ]
      Conversion loses qualifiers
      C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\atlmfc\include\atlcom.h(5803) : while compiling class template member function 'HRESULT ATL::ICollectionOnSTLImpl<IZipFileDir1,EntryList,IZipFileEntry *,_CopyItfFromAdaptItf<IZipFileEntry>,EntryEnum>::get_Item(long,ItemType *)'
      with
      [
          ItemType=IZipFileEntry *
      ]
      C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\atlmfc\include\atlcom.h(5140) : see reference to class template instantiation 'ATL::ICollectionOnSTLImpl<IZipFileDir1,EntryList,IZipFileEntry *,_CopyItfFromAdaptItf<IZipFileEntry>,EntryEnum>' being compiled

错误代码:

代码语言:javascript
复制
if (iter != m_coll.end())
      hr = CopyItem::copy(pvar, &*iter); // Error C2664
return hr;

我无法编辑和保存这个atlcom.h文件。我得到访问路径被拒绝的错误信息。这是因为它是SDK文件吗?

添加了更多的代码定义:

代码语言:javascript
复制
struct _CopyItfFromAdaptItf {
    static HRESULT copy(T** p1, CAdapt< CComPtr<T> >* p2) {
    if( *p1 = p2->m_T ) return (*p1)->AddRef(), S_OK;
    return E_POINTER;
}


IZipFileEntry : public IDispatch
{
    public:
        virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_name( 
        /* [retval][out] */ BSTR *pVal) = 0;

        virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_lastModified( 
        /* [retval][out] */ DATE *pVal) = 0;

        virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_fileSize( 
        /* [retval][out] */ long *pVal) = 0;

        virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_compressedSize( 
        /* [retval][out] */ long *pVal) = 0;

    };


typedef ICollectionOnSTLImpl<IZipFileDir1, EntryList, IZipFileEntry*, _CopyItfFromAdaptItf<IZipFileEntry>, EntryEnum> EntryCollection;

ICollectionOnSTLImpl的定义

代码语言:javascript
复制
class ICollectionOnSTLImpl : 
    public T
{
public:
        STDMETHOD(get_Count)(_Out_ long* pcount)
        {
        if (pcount == NULL)
            return E_POINTER;
        ATLASSUME(m_coll.size()<=LONG_MAX);

        *pcount = (long)m_coll.size();

        return S_OK;
    }
    STDMETHOD(get_Item)(
        _In_ long Index, 
        _Out_ ItemType* pvar)
    {
        //Index is 1-based
        if (pvar == NULL)
            return E_POINTER;
        if (Index < 1)
            return E_INVALIDARG;
        HRESULT hr = E_FAIL;
        Index--;
        CollType::const_iterator iter = m_coll.begin();
        while (iter != m_coll.end() && Index > 0)
        {
            iter++;
            Index--;
        }
        if (iter != m_coll.end())
            hr = CopyItem::copy(pvar, &*iter);
        return hr;
    }
    STDMETHOD(get__NewEnum)(_Outptr_ IUnknown** ppUnk)
    {
        if (ppUnk == NULL)
            return E_POINTER;
        *ppUnk = NULL;
        HRESULT hRes = S_OK;
        CComObject<EnumType>* p;
        hRes = CComObject<EnumType>::CreateInstance(&p);
        if (SUCCEEDED(hRes))
        {
            hRes = p->Init(this, m_coll);
            if (hRes == S_OK)
                hRes = p->QueryInterface(__uuidof(IUnknown), (void**)ppUnk);
        }
        if (hRes != S_OK)
            delete p;
        return hRes;
    }
    CollType m_coll;
};
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-03 07:01:53

如果没有所有的代码,很难说是肯定的,但是看起来我已经用下面的代码重现了这个问题:

代码语言:javascript
复制
template<class T>
struct _CopyItfFromAdaptItf {
    static HRESULT copy(T** p1, CAdapt< CComPtr<T> >* p2) {
        if( *p1 = p2->m_T ) return (*p1)->AddRef(), S_OK;
        return E_POINTER;
    }
};

IDispatch** disp;
const CAdapt<CComPtr<IDispatch>> adapt; // note const here
_CopyItfFromAdaptItf<IDispatch>::copy( disp, &adapt ); //error C2664 here

编译器输出是

代码语言:javascript
复制
File(Line) : error C2664: '_CopyItfFromAdaptItf<T>::copy' :
  cannot convert parameter 2 from 'const ATL::CAdapt<T> *' to 'ATL::CAdapt<T> *'
    with
    [
      T=IDispatch
    ]
    and
    [
      T=ATL::CComPtr<IDispatch>
    ]
    and
    [
      T=ATL::CComPtr<IDispatch>
    ]
    Conversion loses qualifiers

这和你引用的结果很吻合。

问题是_CopyItfFromAdaptItf::copy()想要一个指向非const的指针,但是传递一个指向const的指针。将指针传递给const的代码在atlcom.h中,atlcom.h属于SDK标头,所以最好不要更改它。

另外,如果将_CopyItfFromAdaptItf::copy()签名更改为接受指向const的指针:

代码语言:javascript
复制
static HRESULT copy(T** p1, const CAdapt< CComPtr<T> >* p2) // note addition of const

它仍然编译得很好。_CopyItfFromAdaptItf在ATL中没有位置,所以我想它在您的代码中,您可以更改它。

因此,看起来解决方案是简单地更改_CopyItfFromAdaptItf::copy()以接受指向const的指针,问题就会消失。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22806760

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档