2010-11-03 211 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那样实现返回类型(即返回一个常量作为临时值),只是分配不会产生所需的效果。