不能将参数1从'ATL :: CComPtr <t>'转换为'int'</t>

时间:2014-02-27 12:10:50

标签: visual-c++ com

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

  

错误C2664:'_ com_ptr_t&lt; _IIID&gt; :: _ 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的新手,非常感谢任何修复此错误的帮助。非常感谢。

此致 Ankush。

1 个答案:

答案 0 :(得分:3)

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

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