确保
TiXmlDocument getDocument () { return this->_document; }
不会对其包含的tixmlement进行深度复制。否则返回一个临时的,请在构造函数中使用它来设置根节点,然后根节点将被销毁。我没有查看它的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
TiXmlElement&
(使用A
TiXmlElement*
指针)。但是这个版本
const char*
具有的隐式对象参数
TiXmlElement 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
第一个和第三个重载之间存在歧义。一个简单的解决办法就是
this->setDialogsElement(
this->getRootElement()->FirstChildElement(std::string("dialogs")));
相反,它将调用最后一个版本。另一个解决方法是进行常量转换:
this->setDialogsElement(
const_cast<TiXmlElement const*>(this->getRootElement())->
FirstChildElement("dialogs"));
它将调用第一个版本。至于为什么它只发生在调试中…我记得TiXML有一个选项可以禁用STL。可能在释放模式下,您禁用了它(因此过载
std::string
,但在调试模式下,您忘记了?