VS 报错“无法解析的外部符号” 情况1

博客详细分析了在Visual Studio中遇到的'无法解析的外部符号'错误,特别是在使用类模板时。博主指出,错误主要由于类模板的声明和实现分开放置在不同的文件导致。解释了在编译和链接过程中,由于模板特化需要在编译时完成,因此要求声明和实现放在一起。解决方案是将类模板的实现移到头文件中。博客内容深入浅出,适合C++初学者和开发者阅读。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

VS 报错“无法解析的外部符号” 情况1

  1. 报错截图

  2. 造成原因

  3. 改错方法

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文件中,就不会报错了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值