У меня есть реализация 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
?
EDIT:
Клон специализации:
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;
}
};