读书人

类模板中的成员函数 error LNK2019:

发布时间: 2012-04-23 13:17:38 作者: rapoo

类模板中的成员函数 error LNK2019: 无法解析的外部符号
#include <iostream>

using namespace std;

template<class T>
class Node{
public:
Node(){
left=right=0;
}
Node(const T& val,Node *l=0,Node *r=0){
key=val;
left=l;
right=r;
}
T key;
Node *left,*right;
};

template<class T>
class Tree{
public:
Tree(){
root=0;
}
void MorrisInorder();
void insert(const T& c);


protected:
Node<T> *root;
virtual void visit(Node<T>*p){
cout<<p->key<<' ';
}
};

#include "Tree.h"


template<class T>
void Tree<T>::MorrisInorder(){
Node<T> *p=root,*tmp;
while(p!=0)
if(p->left==0){
visit(p);
p=p->right;
}
else{
tmp=p->left;
while(tmp->right!=0&&tmp->right!=p)
tmp=tmp->right;
if(tmp->right==0){
temp->right=p;
p=p->left;
}
else{
visit(p);
tmp->right=0;
p=p->right;
}
}
}

template<class T>
void Tree<T>::insert(const T& c){
Node<T>*p=root,*prev;
while(p!=0){
prev=p;
if(p->key<c)
p=p->right;
else
p=p->left;
}
if(root==0)
root=new Node<T>(c);
else if(prev->key<c)
p=prev->right=new Node<T>(c);
else p=prev->left=new Node<T>(c);
}

#include <iostream>
#include "Tree.h"

using namespace std;

int main(){

Tree<int>t;
int a[]={4,5,1,3,8,9,7,6};
for(int i=0;i<8;i++)
t.insert(a[i]);
t.MorrisInorder();
}

1>TreeEx.obj : error LNK2019: 无法解析的外部符号 "public: void __thiscall Tree<int>::MorrisInorder(void)" (?MorrisInorder@?$Tree@H@@$$FQAEXXZ),该符号在函数 "int __cdecl main(void)" (?main@@$$HYAHXZ) 中被引用
1>TreeEx.obj : error LNK2019: 无法解析的外部符号 "public: void __thiscall Tree<int>::insert(int const &)" (?insert@?$Tree@H@@$$FQAEXABH@Z),该符号在函数 "int __cdecl main(void)" (?main@@$$HYAHXZ) 中被引用
1>F:\数据结构与算法描述C++版\Tree\Debug\Tree.exe : fatal error LNK1120: 4 个无法解析的外部命令

[解决办法]
模板需要把声明和定义的部分放在同一文件,才能编译
[解决办法]
你的编译器(目前大多如此)不支持模板的分离编译
所以你只能把实现现在.h,否则连接器找不到实现就会这样

读书人网 >C++

热点推荐