【问题标题】:cannot convert parameter 1 from 'ATL::CComPtr<T>' to 'int'无法将参数 1 从 'ATL::CComPtr<T>' 转换为 'int'
【发布时间】:2014-03-30 20:39:18
【问题描述】:

我正在将一个项目从 vs 6.0 迁移到 vs 2008,我收到以下错误,

错误 C2664:'_com_ptr_t<_iiid>::_com_ptr_t(int)':无法转换 参数 1 从 'ATL::CComPtr' 到 'int'

输出窗口:

with
    [
        _IIID=_com_IIID<XML::IXMLDOMNode,& _GUID_2933bf80_7b36_11d2_b20e_00c04f983e60>
    ]
    and
    [
        T=XML::IXMLDOMNode
    ]

我无法解决此问题。在 vs 6.0 中同样可以正常工作,我知道从 vs 6.0 到 vs 2008 的很多事情都发生了变化。

关于以下错误的详细信息:

bool CXMLHelper::GetFirstSubRecord()
{
bool bFound = false;

if ( m_spXMLNode == NULL ) return false;
if ( VARIANT_TRUE == m_spXMLNode->hasChildNodes() )
{
    typedef object_iterator<XML::IXMLDOMNode> iterator;
    for ( iterator oIte(m_spXMLNode->childNodes); oIte != iterator(); ++oIte )
    {
        XML::IXMLDOMNodePtr spNode(*oIte); // c2664 error
        if ( spNode->hasChildNodes() && !CXMLHelper::HasTextChild(spNode) )
        {

            m_spXMLNode = spNode;
            bFound = true;
            break; 
        }
    }
}
return bFound;
}

IXMLDOMNodePt 的定义:

_COM_SMARTPTR_TYPEDEF(IXMLDOMNode, __uuidof(IXMLDOMNode));

我了解该错误是因为编译器无法将 oIte 从“ATL::CComPtr”转换为“int”。我对 COM 很陌生,非常感谢任何解决此错误的帮助。提前非常感谢。

问候, 安库什。

【问题讨论】:

    标签: visual-c++ com


    【解决方案1】:

    问题是,由于某种原因,*oIte 的类型为 ATL::CComPtr_com_ptr_t(模板指针的类型 spNode)没有接受 CComPtr&amp; 的构造函数,但它有两个构造函数,一个接受 @987654326 @ 和另一个接受 Interface* 并且编译器无法选择正确的。您必须明确告诉编译器您希望构造函数接受Interface*,并告诉它提取存储在成员变量CComPtr::p 中的封装Interface*

    XML::IXMLDOMNodePtr spNode((*oIte).p);
    

    【讨论】:

    • 哇,尖牙。这就像魅力一样。非常感谢您的修复和解释。
    猜你喜欢
    • 2014-05-13
    • 2015-06-12
    • 2018-11-25
    • 1970-01-01
    • 1970-01-01
    • 2014-05-19
    • 2014-04-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多