我有一个clone_ptr实现,如this问题所示,我有一个问题,我需要从函数返回的原始指针创建一个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 :(得分:3)
给予clone_ptr
implementation以及doc
是指针的事实,不是document.reset(doc)
吗?
答案 1 :(得分:0)
我不知道库,但是如果document.get()返回一个l值(因此你给它分配的东西看起来很奇怪)会很惊讶。这并不意味着它不会编译,因为很少有人将返回类型实现为const(即返回一个常量作为临时),只是赋值不会产生预期的效果。