关于undefined reference to——C++模板类文件组织方式

2023-10-29 23:32

本文主要是介绍关于undefined reference to——C++模板类文件组织方式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

转载自:http://kyleven.blog.163.com/blog/static/733813072010102444930449/

        今天在实现一个Lock Free的vector时,因为vector的实现方式采用了template的方式实现(后续文章会展示Lock Free的vector的具体实现代码!),在编译的时候出现了如下图中的问题,按照这篇文章的方法解决了问题。但是原理究竟是什么,还不清楚,需要了解编译连接的详细过程!


        以前有人问过我C++的.h文件和.cpp文件的组织方式,当时很随口的回答,.h中是类的声明,.cpp中是类的实现。最近要实现简单二叉树结构,所以用到队列类,我以queue.h,queue.cpp,最后用main.cpp作为测试文件,queue.cpp中#include "queue.h",并在main.cpp中#include "queue.h",想来这是常规的文件组织方式,不会错的。结果却是构建(编译通过,链接错误)过程中出现undefined reference to 一些queue中的方法。显然,编译器找不到该类中的方法。


解决方法一,在main.cpp中#include "queue.cpp",而非"queue.h",这种方式就如同将队列类的声明实现放在同一文件中。
解决方法二,在queue.h中,代码部分结尾处#include "queue.cpp",并且去掉queue.cpp里的包含语句,这与上述方式如出一辄,只是在main.cpp中看上去就像习惯中的方案一样。
解决方法三,声明类时,在类名前加上export关键字,抱歉如今的c++编译器中这关键字多半行不通。就像foreach之类的关键字一样,多半会被认为是关键字,但是却是编译器不认识的。
综上,因为C++模板类中的处理方法不一样,因为需要传入参数才能确定内存如何分配,所以编译完成时并没有解决所有问题,在main.o中便会,找不到它需要用到的方法了。



这篇关于关于undefined reference to——C++模板类文件组织方式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/304121

相关文章

gradle第三方Jar包依赖统一管理方式

《gradle第三方Jar包依赖统一管理方式》:本文主要介绍gradle第三方Jar包依赖统一管理方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录背景实现1.顶层模块build.gradle添加依赖管理插件2.顶层模块build.gradle添加所有管理依赖包

C#如何调用C++库

《C#如何调用C++库》:本文主要介绍C#如何调用C++库方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录方法一:使用P/Invoke1. 导出C++函数2. 定义P/Invoke签名3. 调用C++函数方法二:使用C++/CLI作为桥接1. 创建C++/CL

利用Python打造一个Excel记账模板

《利用Python打造一个Excel记账模板》这篇文章主要为大家详细介绍了如何使用Python打造一个超实用的Excel记账模板,可以帮助大家高效管理财务,迈向财富自由之路,感兴趣的小伙伴快跟随小编一... 目录设置预算百分比超支标红预警记账模板功能介绍基础记账预算管理可视化分析摸鱼时间理财法碎片时间利用财

Linux之systemV共享内存方式

《Linux之systemV共享内存方式》:本文主要介绍Linux之systemV共享内存方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、工作原理二、系统调用接口1、申请共享内存(一)key的获取(二)共享内存的申请2、将共享内存段连接到进程地址空间3、将

Maven中引入 springboot 相关依赖的方式(最新推荐)

《Maven中引入springboot相关依赖的方式(最新推荐)》:本文主要介绍Maven中引入springboot相关依赖的方式(最新推荐),本文给大家介绍的非常详细,对大家的学习或工作具有... 目录Maven中引入 springboot 相关依赖的方式1. 不使用版本管理(不推荐)2、使用版本管理(推

如何在 Spring Boot 中实现 FreeMarker 模板

《如何在SpringBoot中实现FreeMarker模板》FreeMarker是一种功能强大、轻量级的模板引擎,用于在Java应用中生成动态文本输出(如HTML、XML、邮件内容等),本文... 目录什么是 FreeMarker 模板?在 Spring Boot 中实现 FreeMarker 模板1. 环

C#使用StackExchange.Redis实现分布式锁的两种方式介绍

《C#使用StackExchange.Redis实现分布式锁的两种方式介绍》分布式锁在集群的架构中发挥着重要的作用,:本文主要介绍C#使用StackExchange.Redis实现分布式锁的... 目录自定义分布式锁获取锁释放锁自动续期StackExchange.Redis分布式锁获取锁释放锁自动续期分布式

Java对象转换的实现方式汇总

《Java对象转换的实现方式汇总》:本文主要介绍Java对象转换的多种实现方式,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Java对象转换的多种实现方式1. 手动映射(Manual Mapping)2. Builder模式3. 工具类辅助映

Spring Boot读取配置文件的五种方式小结

《SpringBoot读取配置文件的五种方式小结》SpringBoot提供了灵活多样的方式来读取配置文件,这篇文章为大家介绍了5种常见的读取方式,文中的示例代码简洁易懂,大家可以根据自己的需要进... 目录1. 配置文件位置与加载顺序2. 读取配置文件的方式汇总方式一:使用 @Value 注解读取配置方式二

JAVA保证HashMap线程安全的几种方式

《JAVA保证HashMap线程安全的几种方式》HashMap是线程不安全的,这意味着如果多个线程并发地访问和修改同一个HashMap实例,可能会导致数据不一致和其他线程安全问题,本文主要介绍了JAV... 目录1. 使用 Collections.synchronizedMap2. 使用 Concurren