今天写一个模板类,用MingW翻译,出现undefined reference to `RBTreeNode<int, int>::RBTreeNode.....
RBTreeNode是一个模板类,可以见后面的代码。其声明放在了.h中,定义放在了.cpp中。
main.cpp引用BRTreeNode类的构造函数,出现Link Error.
简单分析一下:
共有三个文件RBNode.h,RBNode.cpp,main.cpp
其中RBNode.cpp include BRNode.h
main.cpp引用RBNode.h
由于main.cpp只能看见RBNode.h中的模板方法,在实例化的时候,BRNode.cpp还是undefined,因此就出现了,这个undefined reference错误,解决的方法是
main.cpp
加入#include "RBNode.cpp"即可解决这个问题
代码定义如下:
Code
//文件RBNode.h
#pragma once;
#include <iostream>
#include <list>
using namespace std;
template<class Key,class Value>
class RBTreeNode{
public:
RBTreeNode<Key,Value>* parent;
RBTreeNode<Key,Value>* left_child;
RBTreeNode<Key,Value>* right_child;
Key key;
Value value;
RBTreeNode(Key key,Value value,RBTreeNode<Key,Value>* parent=NULL,RBTreeNode<Key,Value>* left_child=NULL,RBTreeNode<Key,Value>* right_child=NULL);
};
Code
//文件RBNode.cpp
#include "RBNode.h"
template<class Key,class Value>
RBTreeNode<Key,Value>::RBTreeNode(Key key,Value value,RBTreeNode<Key,Value>* parent,RBTreeNode<Key,Value>* left_child,RBTreeNode<Key,Value>* right_child){
this->key=key;
this->value=value;
this->parent=parent;
this->left_child=left_child;
this->right_child=right_child;
}
Code
//文件main.cpp
#include "RBNode.h"
#include "RBNode.cpp"
int main(){
RBTreeNode<int,int> root(1,1);
}
总结:
1.在使用以.h,.cpp分离实现模板类时,不能像使用普通类一样只简单的包涵.h头文件,应该在使用模板类的cpp文件中引入模板类相应的cpp文件
2.将模板类的声明与实现都放在.h中(在多个cpp中使用不同模板参数时可能会引起重复定义的编译错误)