对"类:<Type>:类"的未定义引用
Undefined reference to 'Class<Type>::Class'
可能的重复项:
为什么模板只能在头文件中实现?
我以前遇到过这堵墙,但我不知道如何修复它。在 g++ 中,每当我尝试创建类 BinaryTree 的对象时,我都会收到此错误:
/home/bej0843/cs261/Assignment1/main.cpp:9: undefined reference to `BinaryTree<char>::BinaryTree()'
下面是头文件的代码:
#ifndef BINARYTREE_H
#define BINARYTREE_H
#include <iostream>
#include <cstring>
#include <stack>
using namespace std;
template<typename Type>
class BinaryTree
{
public:
struct TreeNode
{
Type nodeinfo;
BinaryTree<Type> *left;
BinaryTree<Type> *right;
};
BinaryTree();
void setInfo(Type a);
void setSubtree(Type a);
bool isEmpty();
Type Info();
void inOrder();
void preOrder();
void postOrder();
virtual ~BinaryTree();
protected:
TreeNode *root;
stack<TreeNode*> s;
stack<TreeNode*> temp;
private:
void postOrder(TreeNode *r);
};
#endif /* BINARYTREE_H */
以下是其实现的代码:
#include "BinaryTree.h"
template <typename Type>
BinaryTree<Type>::BinaryTree(){
root = NULL;
}
template <typename Type>
void BinaryTree<Type>::setInfo(Type a){
root->nodeinfo = a;
root->left = NULL;
root->right = NULL;
s.push(root);
}
template <typename Type>
void BinaryTree<Type>::setSubtree(Type a){
root->nodeinfo = a;
root->left->root = s.top();
s.pop();
root->right->root = s.top();
s.pop();
s.push(root);
}
template <typename Type>
bool BinaryTree<Type>::isEmpty(){
return (root==NULL);
}
template <typename Type>
Type BinaryTree<Type>::Info(){
return root->nodeinfo;
}
template <typename Type>
void BinaryTree<Type>::inOrder(){
TreeNode *c;
c = s.top();
while (c!=NULL || (!temp.empty())){
if (c!=NULL)
{
temp.push(c);
c = c->left;
}
else{
c = temp.top();
temp.pop();
cout << c->nodeinfo +" ";
c = c->right;
}
}
}
template <typename Type>
void BinaryTree<Type>::postOrder(){
postOrder(s.top());
}
template <typename Type>
void BinaryTree<Type>::postOrder(TreeNode *r){
temp.push(s.top());
TreeNode *c = temp.top();
s.pop();
postOrder(c->left->root);
postOrder(c->right->root);
cout << c->nodeinfo + " ";
}
template <typename Type>
void BinaryTree<Type>::preOrder(){
TreeNode*c = s.top();
while (c!=NULL||(!temp.empty())){
if (c!=NULL){
cout << c->nodeinfo + " ";
temp.push(c);
c=c->left;
}
else{
c=temp.top();
temp.pop();
c=c->right;
}
}
}
template <typename Type>
BinaryTree<Type>::~BinaryTree(){
}
我主要称:
BinaryTree<char> tree;
并得到错误。帮助?
在使用模板类时,您必须将类的实现和声明放在同一个文件中。
编译器需要在使用模板类的同一位置生成代码。
模板类构造函数中的动态分配
你可以这样做。
template <typename T>
class myClass
{
//public and private interface.
} ;
//Here the implementation of the interface goes, just beneath the declaration.
当你编写一个模板化函数时,比如
template <typename Type>
BinaryTree<Type>::BinaryTree(){
root = NULL;
}
编译器在看到模板参数的实例化之前,实际上不会为该函数生成代码。
这就是为什么没有BinaryTree<char>::BinaryTree()
;编译器从未为此生成代码!原因是您的char
实例位于定义此模板函数的单独编译单元(对象文件)中。
若要解决此问题,请将main()
函数放在定义BinaryTree
的所有成员函数的同一文件中,或者将成员函数放在声明类的头文件中。
该错误意味着链接器尚未找到该类型的构造函数的定义。模板化代码中的主要原因是函数的定义(在本例中为 contructor)在实例化的位置不可用,并且没有执行显式实例化。简单的解决方案是在标头中提供模板的定义以使其可用。
相关文章:
- 对C宏的未定义引用,但在定义它时会出现重新定义错误
- 编译时的 CImg 库返回对"__imp_SetDIBitsToDevice"的未定义引用
- 对Py_Initialize()的未定义引用
- 使用mysql c++连接器的未定义引用
- 对 Scalar ::Scalar() 的未定义引用
- 对复制 CTOR 和 CTOR 的未定义引用
- 对显式实例化的模板函数的未定义引用
- TensorRT (C++ API) 对"createNvOnnxParser_INTERNAL"的未定义引用
- 2个模板化类的非模板友元函数未定义引用错误
- 编译 libfluid 样本控制器时对"event_base_del_virtual"的未定义引用
- 获取对function_name的未定义引用
- 对 'std::thread::_M_start_thread CMake 的未定义引用进行基准测试
- 对结构方法的未定义引用
- 使用内联函数 c++ 的未定义引用
- 对 CMake 中'cudaRegisterLinkedBinary'链接错误的未定义引用?
- 对 DLOPEN 的未定义引用
- QT C++中对全局变量的未定义引用
- 快速数学导致对"__pow_finite"的未定义引用
- 对 boost::system::d etail::system_category_instance 的未定义引用,从
- OpenCV 3.4.3 中对 'cv::String::d eallocate()' 错误的未定义引用