VS 报错“无法解析的外部符号” 情况1
1.报错截图
2.造成原因
2.1最主要的原因:
类模板的声明放在h文件,而实现放在cpp文件
2.2 细节叙述
这个程序是准备自己实现一下链式存储的队列,然后队列类模板的声明与实现是分开放的,即声明放在h文件,实现放在cpp文件。
然后就报错了。
2.3原因解释
在优快云上查一查“类模板的声明与实现应该放在同一文件”就可以看到大佬写的原因啦!
我自己的理解:
首先呢,我们在主函数中最开始会include我们自定义的头文件,就相当于把头文件里面的代码加到了主函数的前面,平时写的普通函数或者是类,就可以分开放,而且这应该是标准的方法呀。这个时候如果main函数中无论是调用我们自定义的普通函数还是类的成员函数,编译器都知道我们提前声明了,通过链接器的帮助,就可以在对应的cpp文件中去寻找定义,并执行结果后返回主函数中调用函数的地方,再继续向下执行。这样子是没有问题哒!
在更底层的方面来理解的话,就是编译器在编译时,会将我们写的文件提前编译成二进制代码(这样计算机才能看懂并执行),然后就像上面写的,会把这些二进制代码放到主函数的上面。
但是到了类模板这里,template <class T>,T到底指的是什么?int?double?还是我们自定义的?计算机事先可不知道这些,而且要生成二进制代码的话,也应该是确定了类模板中<T>到底是什么才可以生成计算机可以执行的二进制代码。
因此,如果我们把类模板的声明与实现分开写的话,编译的时候,h文件生成的二进制代码电脑是看不懂的,因为其中的T没有具化,当然计算机也不可能去cpp文件中找定义啦。
放到一起的时候,虽然没有具化,但函数定义与声明都在同一个文件中,省去了到cpp文件找定义这一步(而且计算机也不知道要去)
然后就可以啦!
(以上是我自己的理解,可能有很多地方都会有错,希望看到的各位大大能帮我指出来,谢谢啦!)
改错方法
将cpp文件中的实现全都放到h文件中,就不会报错了。