2010-11-03 7 views
0

J'ai une implémentation de clone_ptr, comme cela a été montré dans la question this et j'ai un problème où je dois créer un clone_ptr à partir d'un pointeur brut renvoyé par une fonction.Convertir un pointeur brut en un clone_ptr

Voici le code:

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 sont déclarés comme suit:

clone_ptr<DOMImplementation, default_clone<DOMImplementation> > impl; 
    clone_ptr<DOMDocument, default_clone<DOMDocument> > document; 

La fonction createDocument ci-dessus renvoie un pointeur DOMDocument brut et est affecté à la variable locale doc, maintenant je veux obtenir mon document clone_ptr et le passer réellement le pointeur brut obtenu de la fonction de document de création. Il semble cependant que le compilateur est pas trop heureux avec cela comme il est dit ce qui suit:

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> 
     ] 

Alors ma question est de savoir comment puis-je permettre à un pointeur brut soit explicitement ou implicitement converti en un clone_ptr? EDIT:

spécialisation Clone: ​​

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

Je ne sais pas si mes réponses à vos deux questions précédentes concernant votre clone-pointeur sont utiles, mais si elles étaient, ce serait bien si vous les acceptez. –

+0

@ Space_C0wb0y: a ajouté un commentaire à la réponse à ma question précédente ... –

Répondre

3

donner à votre clone_ptr implementation, et le fait que doc est un pointeur, ne serait-il document.reset(doc)?

+0

que voulez-vous dire? Y at-il quelque chose qui ne va pas? –

+0

cela est vrai qu'il ne peut pas être cloné, mais j'ai un modèle <> default_clone struct qui est un modèle de spécialisation pour copier le DOMDocument ... –

+0

@Tony: Ah, alors c'est différent de l'implémentation dans la question à laquelle vous avez lié . Je viens d'ajouter un indice disant que vous pourriez vouloir spécialiser votre 'default_clone' plutôt que d'en utiliser un autre ...':) ' – sbi

0

Je ne connais pas la bibliothèque mais serais très surpris si document.get() renvoyait une valeur l (donc votre assignation à quelque chose semble plutôt étrange). Cela ne veut pas dire qu'il ne compilera pas car très peu de gens implémentent des types de retour comme const (ie renvoyer une constante comme temporaire), juste que l'assign n'aura pas l'effet désiré.

Questions connexes