【问题标题】:Undefined reference error in C++ programC++ 程序中未定义的引用错误
【发布时间】:2013-03-11 20:23:35
【问题描述】:

我正在使用 RapidXML 解析 C++ 中的 XML 文件。我制作了 treeNode.h 和 treeNode.cpp 文件。我正在制作一个 treeNode 对象来帮助我进行解析。但是,当我尝试这样做时,它给了我一个未定义的参考错误。给我错误的代码行(我认为)是以下行:

treeNode<xml_node<> > * tn = new treeNode<xml_node<> >(root_node);

如果你想知道我从哪里得到 root_node,它在我的 main.cpp 中定义如下:

xml_document<> doc;
doc.parse<0>(&buffer[0]);               
xml_node<> * root_node = doc.first_node();

错误信息是这样的:

undefined reference to `treeNode<rapidxml::xml_node<char> >::treeNode(rapidxml::xml_node<char>*)'
collect2: ld returned 1 exit status

这些是我在 treeNode.h 中的三个构造函数:

treeNode(T* element1);
treeNode(T* element1, T* parent1);
treeNode(T* element1, T* parent1, vector<treeNode<T>*> child1);

对于修复此错误的任何帮助将不胜感激。谢谢!

【问题讨论】:

  • 乍一看还不错。您确定要链接treeNode.o,而不仅仅是main.o?是否有可能提供一个最小的完整示例?
  • 如何链接treeNode.o?我在 main.cpp 和 treeNode.cpp 中包含了 treeNode.h
  • 是否有 rapidxml 库 - 如果有,您的链接器/编译器调用中需要 -l

标签: c++ xml-parsing compiler-errors linker-errors


【解决方案1】:

我怀疑你在“treeNode.cpp”中实现了treeNode 方法。

在这种情况下,它们还没有被实例化。

全部您的treeNode 实现需要在treeNode.h 标头中,以便编译器可以在使用函数时对其进行实例化。
否则,您将只有声明,没有定义——因为编译器无法生成任何定义——并且您将得到与根本没有任何实现相同的链接错误。

【讨论】:

  • 是的,我已经在 treeNode.cpp 中实现了 treeNode 方法/构造函数,但是您能否更清楚地了解模板实现需要在标头中的含义?您在谈论哪个标题和哪个文件?我确实在我的 treeNode 文件中使用了 template
  • @user2137877 我在答案中添加了更多内容;看看有没有道理。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多