无法找出导致错误的原因"undefined reference to..."
Cannot figure out what causes "undefined reference to..." error
我刚开始学习c++编程语言,并试图实现二叉搜索树数据结构。
当我尝试用
编译文件时g++ -c binary.cpp -o binary.o -std=c++11
g++ -c main.cpp -o main.o -std=c++11
g++ main.o binary.o -std=c++11
那么我总是得到一些错误说有一个"未定义的引用"到某个成员函数,比如
main.o: In function `BSTree<int>::insert(int const&)':
main.cpp:(.text.#some-more-text#.+0x16): undefined reference to
`BSTree<int>::insert(BSTreeNode<int>*, int const&)'
collect2: error: ld returned 1 exit status
下面的代码片段是一个极简的例子:
binary.hpp:
template<typename T>
class BSTreeNode {
public:
T key;
BSTreeNode<T> *left;
BSTreeNode<T> *right;
BSTreeNode(const T& key) : key(key), left(nullptr), right(nullptr) {};
};
template <typename T>
class BSTree {
protected:
BSTreeNode<T> *root;
public:
BSTree() {
root = nullptr;
}
void insert(const T& key) {
root = insert(root, key);
}
protected:
BSTreeNode<T>* insert(BSTreeNode<T>* node, const T& key);
};
binary.cpp
#include "binary.hpp"
template<typename T>
BSTreeNode<T>* BSTree<T>::insert(BSTreeNode<T>* node, const T& key) {
if (not node) {
return new BSTreeNode<T>(key);
}
if (key < node->key) {
node->left = insert(node->left, key);
} else if (key > node->key) {
node->right = insert(node->right, key);
} else {
throw "Key already exists!";
}
return node;
}
main.cpp:
#include "binary.hpp"
#include <math.h>
int main(){
BSTree<int> bt;
for (int i=0; i<10; i++){
bt.insert(pow(-1, i) * i);
}
即使经过详尽的搜索,我仍然不知道我的代码有什么问题。
链接器无法解析模板类在单独文件中的函数定义。试着把它放在同一个头文件中,而不是cpp。
问题出在源文件中bstreet::insert()的模板定义中。简单地说,在main中调用bstreet::insert()。编译器需要模板函数BSTree::insert()的定义,但是找不到,因为它没有在头文件中定义。请记住,每个*.cpp文件是独立编译的。
我建议你在头文件中给出模板的定义,因为您必须在每个源文件中给出一个(可能不同的)定义。
相关文章:
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- Visual Studio Code "undefined reference to `WinMain@16'"
- 使用 MATLAB 编码器生成C++代码:编译错误"undefined reference to `rgb2gray_tbb_real64'"
- 为什么创建友元类的实例会导致"undefined reference to"错误?
- Tensorflow c++ api undefined reference to 'tflite::D efaultErrorReporter()'
- OpenCV undefined reference to 'cv::imread(cv::String const&, int)'
- Libcurl c++ "undefined reference to" (Windows/MinGW/g++)
- 尝试使用 extern "C" 调用 C 中的C++方法,得到"undefined reference to"对象的链接器错误
- build error : undefined reference to `yyFlexLexer::yyFlexLex
- 使用 G++ 编译时"Undefined Refrence to Foo"
- 声明和定义函数静态会产生"undefined reference to function_name()"
- C++ : "undefined reference to"可能是因为CMake文件
- AppData\Local\Temp\cc59LXDc.o:test1.cpp: undefined reference to 'constructNewObjectOfClass
- YAML-cpp 编译错误:"undefined reference to YAML::LoadFile"
- 添加 cpp11 插件时出现错误消息"Undefined reference to boost (...)"
- 获得"undefined reference to"
- 如何修复 cpp 中的"undefined reference to"错误,当调用刚性车身树中的函数时,如 doKinematics、CreateKinematicCache
- 如何在arduino ide中修复"undefined reference to:",尝试使用googletest
- android c++ undefined reference to eglGetCurrentContext
- 将单独的头文件和类定义文件链接到主函数文件 - G++ 返回重载"undefined reference to"构造函数