2008-12-17 9 views
1

Je suis en train de réécrire un projet pour qu'il utilise accesseurs pour référencer le TiXmlElement * » s Cependant, je heurterez rapidement des problèmes qui semblent être liés au mode de débogage:getter et emballages setter pour TiXmlElement * « s

Ecxerpt de l'en-tête de ma classe:

TiXmlElement *_rootElement; 
TiXmlElement *_dialogsElement; 
TiXmlElement *_dialogElement; 
TiXmlDocument _document; 
void setDocument (TiXmlDocument doc) { this->_document = doc; } 
void setRootElement (TiXmlElement * element) { this->_rootElement = element; } 
void setDialogsElement (TiXmlElement * element) { this->_dialogsElement = element; } 

TiXmlDocument getDocument() { return this->_document; } 
TiXmlElement* getRootElement() { return this->_rootElement; } 
TiXmlElement* getDialogsElement() { return this->_dialogsElement; } 

Extrait du constructeur de la classe:

DCXML::DCXML(const char *dialogMark,const char *dialogName,TiXmlDocument doc) { 
... 
this->setDocument(doc); 
this->setRootElement(this->getDocument().FirstChildElement("dcxml")); 
this->setDialogsElement(this->getRootElement()->FirstChildElement("dialogs")); 

Extrait de instancier la classe:

TiXmlDocument doc(input.gettok(2,"\"").to_chr()); 
bool dcxmlFile = doc.LoadFile(); 
... 
DCXML *dcxml = new DCXML(input.gettok(2).to_chr(),input.gettok(3).to_chr(),doc); 

Maintenant, pour la partie étrange. Cela fonctionne jusqu'à

this->setDialogsElement(this->getRootElement()->FirstChildElement("dialogs")); 

dans le constructeur. -> FirstChildElement ("dialogs") renvoie une erreur "CXX0039: Erreur: symbole est ambigu" dans VS2008 en mode débogage.

La partie étrange est IntelliSense ramasse sur la méthode FirstChildElement et le compilateur ne jette pas d'erreurs. Ce qui est encore plus bizarre, c'est qu'en mode release, il échoue simplement en silence pour obtenir l'élément dialogs.

Qu'est-ce que je fais mal? Ou si vous avez implémenté avec succès des wrappers getter setter pour TiXmlElement *, faites-moi savoir comment je peux le faire!

Pour référence complète est ici un extrait du fichier XML:

<?xml version="1.0" encoding="utf-8"?> 
<dcxml> 
    <dialogs> 
     <dialog 
      name="mediaplayer" 
      center="" 
      w="300" 
      h="400" 
      caption="Mamp 4.0 BETA" 
      border="btmnzy"> 
     </dialog> 
    </dialogs> 
</dcxml> 

commentaires serait très apprécié que je suis dans une impasse :)

Répondre

2

Assurez-vous que

TiXmlDocument getDocument() { return this->_document; } 

Ne copiera pas en profondeur son contenu TiXmlElement. Sinon vous renvoyez un temporaire, utilisez cela dans le constructeur pour définir le nœud racine, qui sera alors déjà détruit. Je n'ai pas regardé dans son API, mais juste être conscient de ces pièges.

La raison de l'appel ambigu est parce que:

Il y a trois de FirstChildElement prendre les surcharges un argument:

const TiXmlElement * FirstChildElement (const char *value) const // :1 
const TiXmlElement * FirstChildElement (const std::string &_value) const // :2 
TiXmlElement  * FirstChildElement (const std::string &_value) // :3 

Vous accédez à la TiXmlElement par TiXmlElement& (à l'aide d'un pointeur TiXmlElement*). Mais la version prenant un const char* a un paramètre d'objet implicite de TiXmlElement const&. Autrement dit, une conversion de qualification est nécessaire pour que l'appel fonctionne. Pour les autres versions prenant un std::string const&, il y a des conversions nécessaires aussi:

<implied obj param> <implicit obj param> <arg1>   <param1> 
TiXmlElement&  TiXmlElement const& char const* char const*   // :1 
TiXmlElement&  TiXmlElement const& char const* std::string const& // :2 
TiXmlElement&  TiXmlElement&   char const* std::string const& // :3 

Il y a une ambiguïté entre la première et la troisième surcharge.Une solution facile est de faire

this->setDialogsElement(
    this->getRootElement()->FirstChildElement(std::string("dialogs"))); 

Au lieu de cela, qui appellera la dernière version. Une autre correction est de const_cast:

this->setDialogsElement(
    const_cast<TiXmlElement const*>(this->getRootElement())-> 
     FirstChildElement("dialogs")); 

Qui appellera la première version. Quant à savoir pourquoi cela se produit uniquement dans DEBUG ... Je me souviens que TiXML a une option pour désactiver l'utilisation de la STL. Peut-être qu'en mode release vous l'avez désactivé (et donc les surcharges en prenant std::string), mais en mode debug vous avez oublié?

Questions connexes