0

我有一个 clone_ptr 实现,如this question所示,我有一个问题,我需要从函数返回的原始指针创建一个 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>
        ]

所以我的问题是如何允许将原始指针显式或隐式转换为 a 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;
    }
};
4

2 回答 2

3

给出你的clone_ptr实现,以及它是一个指针的事实,doc不是document.reset(doc)吗?

于 2010-11-03T09:03:28.650 回答
0

我不知道这个库,但如果 document.get() 返回一个左值,我会非常惊讶(因此你给它分配一些东西似乎很奇怪)。这并不意味着它不会编译,因为很少有人将返回类型实现为 const (即返回一个常量作为临时变量),只是分配不会产生预期的效果。

于 2010-11-03T10:54:18.297 回答