この質問に示されているように、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
関数はrawポインターを返しDOMDocument
、ローカル変数doc
に割り当てられます。ここで、ドキュメントclone_ptrを取得し、実際にcreatedocument関数から取得したrawポインターを渡します。ただし、コンパイラは次のように言っているので、これにあまり満足していないようです。
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;
}
};