0

この質問に示されているように、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

documentimplが次のように宣言されている場合:

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;
    }
};
4

2 に答える 2

3

clone_ptrあなたの実装docとそれがポインタであるという事実を与えると、そうではありませんdocument.reset(doc)か?

于 2010-11-03T09:03:28.650 に答える
0

ライブラリはわかりませんが、document.get()がl値を返した場合は非常に驚きます(したがって、ライブラリに何かを割り当てるのはかなり奇妙に思えます)。これは、戻り型をconstとして実装する(つまり、定数を一時として返す)人がほとんどいないためにコンパイルされないという意味ではなく、単に割り当てが目的の効果をもたらさないということです。

于 2010-11-03T10:54:18.297 に答える