2010-11-03 212 views
0

我有一個clone_ptr實現,如this問題所示,我有一個問題,我需要從函數返回的原始指針創建clone_ptr。將原始指針轉換爲clone_ptr

下面是代碼:

DOMDocument* doc = impl->createDocument(
               0,     // root element namespace URI. 
               XML::X(docname.c_str()), // root element name 
               0);     // document type object (DTD). 
     document.get() = *doc; //No way to assign clone_ptr document to raw doc pointer 

document & impl聲明如下:

clone_ptr<DOMImplementation, default_clone<DOMImplementation> > impl; 
    clone_ptr<DOMDocument, default_clone<DOMDocument> > document; 

上述createDocument函數返回一個原DOMDocument指針和被分配給本地變量doc,現在我想獲取我的文檔clone_ptr,並實際上將它從創建文檔函數中獲取的原始指針傳遞給它。這似乎但是編譯器是不是太滿意這個,因爲它說以下內容:

error C2440: '=' : cannot convert from 'xercesc_3_1::DOMDocument' to 'clone_ptr<T,Cloner>::pointer' 
     with 
     [ 
      T=xercesc_3_1::DOMDocument, 
      Cloner=default_clone<xercesc_3_1::DOMDocument> 
     ] 

所以我的問題是我怎麼能允許一個原始指針是明確或隱式轉換爲clone_ptr? 編輯:

克隆專業化:

template<typename T> 
struct default_clone 
{ 
    static T* clone(T* pPtr) 
    { 
     return pPtr ? pPtr->clone() : 0; 
    } 
}; 

template<> 
struct default_clone<DOMDocument> 
{ 
    static DOMDocument* clone(DOMDocument* pPtr) 
    { 
     DOMImplementation* impl = DOMImplementationRegistry::getDOMImplementation(XML::X("Core")); 
     return pPtr ? impl->createDocument(0, XML::X(""), 0) : 0; 
    } 
}; 

template<> 
struct default_clone<DOMImplementation> 
{ 
    static DOMImplementation* clone(DOMImplementation* pPtr) 
    { 
     return pPtr ? DOMImplementationRegistry::getDOMImplementation(XML::X("Core")) : 0; 
    } 
}; 
+0

我不知道我的答案是否對你以前的兩個問題有關你的克隆指針有用,但如果他們在哪裏,如果你接受它們會很好。 – 2010-11-03 09:06:23

+0

@ Space_C0wb0y:對我的上一個問題的答案添加了評論... – 2010-11-03 09:11:30

回答

3

給你的clone_ptr implementation,而事實上,doc是一個指針,是不是很document.reset(doc)

+0

你是什麼意思?它有什麼問題嗎? – 2010-11-03 09:07:06

+0

這是真的,它不能被克隆,但是我有一個模板<> default_clone 結構,這是一個模板專門化複製DOMDocument ... – 2010-11-03 09:08:05

+0

@Tony:啊,那麼它不同於你實現鏈接到的問題。我剛剛添加了一個提示,說你可能想專門化你的'default_clone'而不是使用不同的...':)' – sbi 2010-11-03 09:13:32

0

我不知道庫,但會很驚訝,如果document.get()返回一個l值(因此您分配給它的東西似乎很奇怪)。這並不意味着它不會編譯,因爲很少有人像const那樣實現返回類型(即返回一個常量作爲臨時值),只是分配不會產生所需的效果。