Преобразовать необработанный указатель в clone_ptr - PullRequest
0 голосов
/ 03 ноября 2010

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

Ответы [ 2 ]

3 голосов
/ 03 ноября 2010

Предоставление вашей clone_ptr реализации и тот факт, что doc является указателем, не будет ли document.reset(doc)?

0 голосов
/ 03 ноября 2010

Я не знаю библиотеку, но был бы очень удивлен, если document.get () вернул l-значение (таким образом, ваше присвоение чего-то ему кажется довольно странным).Это не значит, что он не будет компилироваться, так как очень немногие люди реализуют возвращаемые типы как const (т. Е. Возвращают константу как временную), просто что присвоение не будет иметь желаемого эффекта.

...