error LNK2019无法解析的外部符号解决方案 && error LNK1120: 1 个无法解析的外部命令

来源:互联网 发布:国外开源cms 编辑:程序博客网 时间:2024/05/27 00:43

编程过程中常见error总结(一)
这里写图片描述
相信大家在编程的时候都被上面类似的错误困扰过,无法解析的外部符号?什么意思?其实原因几乎是相同的,就是函数只是声明了却没有定义,上面错误列表的出现就是因为我把相应的函数注释掉了(为了演示),但是我们在写较多的代码的时候很容易把某些函数的定义忽略掉,就会造成自己都不知道错误出在哪里。下面就拿几种常见的做解析:

1.《有相应的函数声明但是没有函数定义》——这种比较好理解也容易解决,只要把没有定义的函数的代码补上就行了。例如提示这样的错误信息:错误 2 error LNK2001: 无法解析的外部符号 “public: virtual bool __thiscall SeqStack::IsFull(void)const ” (?IsFull@?$SeqStack@H@@UBE_NXZ)……,这个就代表IsFull(void)这个函数只是声明了,但是用的时候没有相应的定义。

  1. 《析构函数——重点注意》——这个错误的产生实际上和第一种的原因是一样的,但是这种析构函数忘了定义的情况太容易产生了,所以在这里作为一种易错错误来强调,希望大家永远记住。
  2. 《重载输出运算符 && 模板类》——这个错误比较特殊,我遇到的时候也郁闷了很久,是在写C++的模板类的时候,重载<<输出运算符(这是我当时的声明:friend ostream & operator << (ostream& os, SeqStack s)),在class外我进行了相应的定义(这是我当时的定义: ostream & operator << (ostream& os, SeqStack s) {
    os << “top = ” << s.top << endl; //输出栈顶位置
    for (int i = 0; i <= s.top; i++) {
    os << i << “:” << s.elements[i] << endl;
    }
    return os;
    })。看似合理的一切总是会报出意外的错误:错误 1 error LNK2019: 无法解析的外部符号 “public: __thiscall SeqStack::~SeqStack(void)” (??1?SeqStack@H@@QAE@XZ),该符号在函数 "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl operator<<(class std::basic_ostream<char,struct std::char_traits<char> > &,class SeqStack<int>)" (??6@YAAAV?basic_ostream@DU?chartraits@D@std@@@std@@AAV01@V?SeqStack@H@@@Z) 中被引用。这是为什么呢?函数的声明和定义都在,却依旧提示这个流重载函数没有定义。琢磨了好久,又查找资料终于解决了,根本原因是——模板类。
    “这是因为代码中用到模板类template 而在类内声明友元函数的时候也用到了,所以此时友元函数是依赖于类的实现而实现的,编译器才会报错。”这是原文的解释,解决方式也不一样,这里给出原文链接(文章中给出了详细的方法及原因) C++模板类中声明友元函数重载输入和输出运算符时,提示无法解析的外部符号解决方案
    尊重原著!)。
阅读全文
1 0
原创粉丝点击