【问题标题】:TinyXML #include problem... Using librariesTinyXML #include 问题...使用库
【发布时间】:2011-01-25 11:26:42
【问题描述】:

嘿,我真的想让 TinyXML 至少读取一个文件,但它说“main.cpp:8: error: ‘TiXMLDocument’ is not declared in this scope”

这是我使用的代码:

TiXMLDocument("demo.xml");

理想情况下,我希望能够读取文件并输出 XML,所以我也尝试了我在教程中在线找到的这段代码

#include <iostream>

#include "tinyxml.h"
#include "tinystr.h"

void dump_to_stdout(const char* pFilename)
{
    TiXmlDocument doc(pFilename);
    bool loadOkay = doc.LoadFile();
    if (loadOkay)
    {
        printf("\n%s:\n", pFilename);
        dump_to_stdout( &doc ); // defined later in the tutorial
    }
    else
    {
        printf("Failed to load file \"%s\"\n", pFilename);
    }
}

int main(void)
{
    dump_to_stdout("demo.xml");
    return 0;
}

我现在遇到的错误是:

main.cpp: In function ‘void dump_to_stdout(const char*)’:
main.cpp:13: error: cannot convert ‘TiXmlDocument*’ to ‘const char*’ for argument ‘1’ to ‘void dump_to_stdout(const char*)’

如果它在 Mac 上对我有帮助,我尝试在终端和 textmate 中编译。我还尝试在编译 main.cpp 之前分别为 TinyXML 编译 cpp 文件,但我不知道为什么我无法打印出 demo.xml,更不用说阅读了。

【问题讨论】:

    标签: c++ terminal textmate libraries tinyxml


    【解决方案1】:
    1. 它叫TiXmlDocument,而不是TiXMLDocument
    2. 您不能调用尚未声明的函数。由于您尝试调用 dump_to_stdout 的未声明重载,因此编译器假定您要调用采用 const char * 的版本并失败。

    【讨论】:

    • 抱歉,正在处理第二批代码...但我尝试更改为 TiXmlDocument 仍然无法正常工作。未定义的符号:“TiXmlNode::~TiXmlNode()”,引用自:TiXmlDocument::~TiXmlDocument()in ccfppiJ4.o "vtable for TiXmlDocument",引用自:TiXmlDocument::~TiXmlDocument()in ccfppiJ4.o "TiXmlString: :nullrep_”,引用自:ccfppiJ4.o 中的 TiXmlString::quit() “TiXmlDocument::TiXmlDocument(char const*)”,引用自:ccfppiJ4.o 中的 _main ld:未找到符号 collect2:ld 返回 1退出状态
    • @CurtisJC:这是一个链接器错误。你在链接-ltinyxml吗?
    • @AFAIK,我从来没有使用过 tinyxml 有一个库。我一直只需要在我的项目中包含源文件。我的理解是它们一直是这样分布的。这可能是这里的问题吗?
    • @Moo-Juice, @CurtisJC:TinyXML 在一些 Linux 平台上作为共享库分发,包括 Debian 和 Ubuntu。否则,Curtis 会忘记链接目标文件。
    • 编译所有文件后(使用gcc -c),运行gcc 和所有生成的.o 文件。有关详细信息,请参阅 GCC 手册。
    【解决方案2】:
    dump_to_stdout( &doc ); // defined later in the tutorial
    

    这是你的问题。

    1. dump_to_stdout 需要 const char*,而 TiXmlDocument 绝对不是。
    2. 您已经该函数中,因此假设文件加载,您将拥有无限递归。
    3. 您稍后定义一个接受 TiXmlDocument 的文件并不重要。此时,唯一存在的dump_to_stdout 就是您所在的那个,因此出现了错误。在这个函数之前前向声明你想要的,例如:void dump_to_stdout(TiXmlDocument*);

    【讨论】:

    • 编译器错误清楚地表明没有发生无限递归。它只是不会编译。
    • @larsmans,我知道这一点。我只是指出,如果确实解决了(例如,如果文档有一个 const char* 运算符),它将递归。这当然不是我的建议的基础。
    • 您的所有其他建议都是完全正确的。但是,除非 dump_to_stdout(TiXmlDocument*) 回调到 dump_to_stdout(const char *),否则 C++ 的重载决议将阻止无限递归。
    猜你喜欢
    • 1970-01-01
    • 2014-04-20
    • 2017-12-10
    • 2014-05-17
    • 1970-01-01
    • 1970-01-01
    • 2013-01-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多