error LNK2019: 无法解析的外部符号

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了error LNK2019: 无法解析的外部符号相关的知识,希望对你有一定的参考价值。

win32控制台程序,没使用动态库,设计了一个矩阵类模版,连接时产生
error LNK2019: 无法解析的外部符号 "public: virtual __thiscall matrix <double>::~matrix <double>(void)" (??1?$matrix@N@@UAE@XZ),该符号在函数 _wmain 中被引用
1>test.obj : error LNK2019: 无法解析的外部符号 "public: __thiscall matrix <double>::matrix <double>(void)" (??0?$matrix@N@@QAE@XZ),该符号在函数 _wmain 中被引用

matrix.h 如下
template <class T> class matrix

public:
//构造和析构
matrix();
matrix(int row,int col);
matrix(int row,int col,T value[]);
matrix(const matrix& other);

bool init(int row,int col);
void set(T value[]);

virtual ~matrix();
//构造和析构 end
......


matrix.cpp 如下
//构造和析构
template <class T> matrix <T>::matrix()

mp=NULL;
if(init(1,1)==0)
cout < <"矩阵初始化失败" < <endl;


.......

什么原因啊,是模版声明和定义时写的不对吗,请高手帮忙解决一下,谢谢了!

另外将成员函数定义放在主函数文件中就通过编译和连接了,不知问题出在哪
我用的是vs2008,和它有关吗?,另外模版编译是不是比较特别,要在头包含成员函数的实现文件,我也试过没成功,说声明和定义不匹配

参考技术A 记住::、

模板类的“声明”和“实现”必须在“同一个”“文件”里,

要么都在matrix.h里 ,要么都在 matrix.cpp里本回答被提问者采纳

error LNK2019: 无法解析的外部符

错误 2 error LNK2019: 无法解析的外部符号 "public: class Node __thiscall SeqStack<class Node>::Pop(void)" (?Pop@?$SeqStack@VNode@@@@QAE?AVNode@@XZ),该符号在函数 "void __cdecl go(int,int,int,int)" (?go@@YAXHHHH@Z) 中被引用 D:\UserData\Administrator\桌面\迷宫\Maze\迷宫\main.obj Maze

错误 3 error LNK2019: 无法解析的外部符号 "public: void __thiscall SeqStack<class Node>::Push(class Node)" (?Push@?$SeqStack@VNode@@@@QAEXVNode@@@Z),该符号在函数 "void __cdecl go(int,int,int,int)" (?go@@YAXHHHH@Z) 中被引用 D:\UserData\Administrator\桌面\迷宫\Maze\迷宫\main.obj Maze

代码:
Node.cpp

class Node
public:
int n;
int m;
;

SeqStack.h
const int StackSize=100;
template<class DataType>
class SeqStack

public:
SeqStack()top=-1;
~SeqStack()
void Push(DataType x);
DataType Pop();
DataType GetTop()if (top!=-1)return data[top];
int Empty()top==-!?return 1:return 0;
private:
DataType data[StackSize];
int top;
;

SeqStack.cpp

#include"SeqStack.h"
#include"Node.cpp"
template <class DataType>
void SeqStack<DataType>::Push(DataType x)

if(top==SeqStack-1)
throw "上溢";
data[++top]=x;

template<class DataType>
DataType SeqStack<DataType>::Pop()

if(top==-1)
throw "下溢";
x=data[top--];
return x;


main.cpp

#include<iostream>
#include"SeqStack.h"
#include"Node.cpp"
using namespace std;
int M[10][10]=0;
SeqStack<Node> a;
void go(int i,int j,int z,int d)

Node* p=&(a.GetTop());
if(M[i][j]==0)

if(p->n==z&&p->m==d)

//写个输出路径函数

else
Node t;
t.n=i; t.m=j+1;
a.Push(t);
go(p->n,(p->m)+1,z,d);
go((p->n)+1,p->m,z,d);
go(p->n,(p->m)-1,z,d);
go((p->n)-1,p->m,z,d);


else

a.Pop();
p=&(a.GetTop());


int main()


cout<<"请输入迷宫"<<endl;
for(int i=0;i<10;i++) //i 行号

for(int j=0;j<10;j++) //j 列号

cout<<"第"<<i<<"行"<<j<<"列的元素为"<<endl;
int m;
cin>>m;
M[i][j]=m;


cout<<"请输入起始位置和终点位置"<<endl;
int i,j,z,d;
cin>>i>>j>>z>>d;
go(i,j,z,d);


我写的是走迷宫的程序,链接的时候总是出现2019,网上查说是查看变量的声明部分,或者类声明了没定义的问题。但是我找了半天也没有找到哪里出了问题。希望大家能帮我指出

参考技术A 模板的定义和实现不要分离开来(即不要分开写在.h和.cpp)中。
应该写在一起,放在一个.hpp的文件内,否则会因为模板没有实例化(类是类模板的实例)而报找不到符号的链接错误。本回答被提问者采纳
参考技术B 出现这种原因其中可能就是你的函数和头文件里面声明的不一样,名字相同但参数不同或者类型不同,再或者是某些地方不支持,例如CString类型只有MFC才支持,到了控制台程序里就不受用

以上是关于error LNK2019: 无法解析的外部符号的主要内容,如果未能解决你的问题,请参考以下文章

windows error LNK2019

error LNK2019: 无法解析的外部符号

error LNK2019: 无法解析的外部符号

error LNK2019: 无法解析的外部符号

error LNK2019: 无法解析的外部符号 WinMain,error LNK2001: 无法解析的外部符号 WinMain

error LNK2019: 无法解析的外部符号