2014-02-27 71 views
2

我移植一個項目從VS 6.0到VS 2008年,我得到以下錯誤,無法從 'ATL ::但是CComPtr <T>' 轉換參數1到 '廉政'

錯誤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)); 

我知道錯誤是因爲編譯器無法將'ATL :: CComPtr'的oIte轉換爲'int'。我對COM很陌生,不勝感激任何幫助解決這個錯誤。提前致謝。

Regards, Ankush。

回答

3

的問題是,由於某些原因*oIteATL::CComPtr類型和_com_ptr_t(類型的模板指針spNode的)的沒有構造接受CComPtr&而是它有兩個構造一個接受int和其他accpting Interface*和編譯器可以」選擇適當的一個。你必須明確地給你想要的構造函數接受Interface*和實現,你必須告訴它提取封裝Interface*存儲在成員變量CComPtr::p編譯器說:

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

哇銳齒。這就像魅力一樣。非常感謝修復和解釋。 – user3360310

相關問題