C++ TiXmlElement*'的吸气剂和塞特包装器;s

C++ TiXmlElement*'的吸气剂和塞特包装器;s,c++,tinyxml,C++,Tinyxml,我正在重写一个项目,以便它使用getter和setter来引用tixmlement* 但是,我很快遇到了与调试模式相关的问题: 我的类标题中的Ecxerpt: TiXmlElement *_rootElement; TiXmlElement *_dialogsElement; TiXmlElement *_dialogElement; TiXmlDocument _document; void setDocument (TiXmlDocument doc) { this->_documen

我正在重写一个项目,以便它使用getter和setter来引用tixmlement* 但是,我很快遇到了与调试模式相关的问题:

我的类标题中的Ecxerpt:

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; }
摘自类构造函数:

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"));
从实例化类中摘录:

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);
现在是奇怪的部分。直到

this->setDialogsElement(this->getRootElement()->FirstChildElement("dialogs"));
在构造函数中

->处于调试模式时,FirstChildElement(“对话框”)在VS2008中抛出“CXX0039:错误:符号不明确”错误

奇怪的是IntelliSense使用FirstChildElement方法,编译器不会抛出任何错误

更奇怪的是,在发布模式下,它只是默默地无法获取dialogs元素

我做错了什么?或者,如果您已经成功地为TiXmlElement*实现了getter setter包装器,那么也请告诉我如何实现它

以下是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>

由于我正处于死胡同,我们将非常感谢您的反馈:)

请确保

TiXmlDocument getDocument () { return this->_document; } 
不会深度复制其包含的TiXmlElement。否则返回一个临时值,在构造函数中使用该值设置根节点,然后根节点将被销毁。我没有查看它的API,但要注意这些陷阱

调用不明确的原因是:

FirstChildElement
有三个重载,每个重载包含一个参数:

const TiXmlElement *    FirstChildElement (const char *value) const // :1
const TiXmlElement *    FirstChildElement (const std::string &_value) const // :2
TiXmlElement       *    FirstChildElement (const std::string &_value) // :3
您可以通过
tixmlement&
(使用
tixmlement*
指针)访问tixmlement。但是采用
常量char*
的版本有一个隐式对象参数
tixmlement const&
。也就是说,需要进行资格转换才能使调用正常工作。对于采用
std::string const&
的其他版本,也需要进行转换:

<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
相反,它将调用最后一个版本。另一个修复方法是const_cast:

this->setDialogsElement(
    const_cast<TiXmlElement const*>(this->getRootElement())->
        FirstChildElement("dialogs"));
this->setDialogsElement(
const_cast(this->getRootElement())->
FirstChildElement(“对话框”);
这将调用第一个版本。至于为什么它只发生在调试中。。。我记得TiXML有一个禁用STL的选项。也许在发布模式下您禁用了它(因此重载采用了
std::string
),但在调试模式下您忘记了吗

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