c++中模板类的成员函数的声明与定义应该放在头文件里

2023-05-16

今天尝试自己实现vector数据结构底层,在定义vector模板类的时候,还想像往常一样把类分为.h文件和.cpp文件,把成员函数的声明放在.h文件中,把具体实现放在.cpp文件中,结果在测试时发现在编译过程中报错。调试了很久,重视提示“无法解析的外部符号”,如图所示:

                         

最终我找到了原因:

引用C++primer的话:C++支持两种模板编译模式包含模式Inclusion  Model  和分离模式Separation  Model  

1. 包含编译模式  

在包含编译模式下我们在每个模板被实例化的文件中包含函数模板的定义并且往往把定义放在头文件中像对内联函数所做的那样 

2. 分离编译模式    

在分离编译模式下函数模板的声明被放在头文件中 ,  在模板定义中有一个关键字export,  关键字export  告诉编译器在生成被其他文件使用的函数模板实例时可能需要这个模板定义编译器必须保证在生成这些实例时该模板定义是可见的 , 关键字export  不需要出现在头文件的模板声明中, 分离模式使我们能够很好地将函数模板的接口同其实现分开进而组织好程序以便把函数模板的接口放到头文件中而把实现放在文本文件中, 但是并不是所有的编译器都支持分离模式, 即使支持也未必总能支持得很好, 支持分离模式需要更复杂的程序设计环境所以它们不能在所有C++编译器实现中提供.  

理解: 现在的VC++编译器都不知道模板分离编译模式,所以还是要把定义与实现都放在一个文件中。

再回头看上面的例子,可以知道构造函数也是一个模板,在main.cpp中创建一个vector要创建一个构造函数模板的实例 。实例化要素体现在main.cpp文件中,如一些函数的实参(a,b,c)。如果按照传统方式,编译器在vector.h文件中看到了模板的声明,但没有模板的定义,这样编译器就不能创建vector(a,b,c)。但这时并不出错,因为编译器认为模板定义在其它文件中,就把问题留给链接程序处理。  现在,编译vector.cpp时会发生什么问题呢?编译器可以解析模板定义并检查语法,但不能生成成员函数的代码。它无法生成代码,因为要生成代码,需要知道模板参数,即需要一个类型,而不是模板本身。这样,链接程序在main.cpp 或 vector.cpp中都找不到vector(a,b,c)的定义,于是报出无定义成员的错误。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c++中模板类的成员函数的声明与定义应该放在头文件里 的相关文章

  • vector数组 传递 引用 指针 参数

    一 一维 span class hljs stl container span class hljs built in vector span lt span class hljs keyword int span gt span vec
  • Oracle # 字符串匹配函数(Oracle、SQLSERVER、Excel)

    引言 xff1a 当数据库设置字段的时候 xff0c 会设置1表XXX xff1b 0表示XXX 查询的时候怎么显示汉字呢 xff1f Oracle数据库 xff1a 普通查询数据 xff1a select from U ORANGEZAT
  • 时间序列预测——Prophet模型

    文章链接 xff1a 时间序列预测 ARIMA模型 https blog csdn net beiye article details 123317316 spm 61 1001 2014 3001 5502 1 Propht模型概述 Pr
  • 机器人导航——路径跟踪

    要完成一套完整的机器人路径规划 xff0c 并完成其物理实验并非一件简单的事情 参考 xff1a http wenku baidu com link url 61 n11mP6EDlM78NZYZ4yQYXzmzPeBV6BeLNOUjIv
  • python 读取txt出现\xef\xbb\xbf…的问题

    用python读取txt文件 xff0c 文件的内容是一列数如下 xff1a 1883 1886 1900 1900 1897 1897 1897 1897 1906 1917 1910 1910 但是读取的时候第一个元素为 xef xbb
  • (算法)判断两个区间是否重叠

    题目 xff1a 判断两个区间是否重叠 思路 xff1a 假设区间表示为 start end xff0c 先存在两个区间A B 两个区间的关系有两种 xff1a 重叠与不重叠 重叠的情况有4种 xff0c 两种相交 xff0c 两种包含 x
  • python ctrl+c 退出while True:

    写了一个死循环 xff0c 类似 xff1a def function while True my code 程序运行后想用ctrl 43 c按键停止程序 xff0c 可是终止不了 以下为解决办法 xff1a 第一步 xff1a 加入sys
  • python二维字典

    感谢原文 xff1a http www jb51 net article 83108 htm 本文实例讲述了Python的 二维 字典 two dimension dictionary 定义与实现方法 分享给大家供大家参考 xff0c 具体
  • ros安装出现依赖问题

    http www liuxiao org 2015 10 ros E5 9C A8 ubuntu 14 04 E7 B3 BB E7 BB 9F E4 B8 8A E5 AE 89 E8 A3 85 ros indigo 0 安装环境 xf
  • KMP算法介绍

    参考 xff1a https www cnblogs com c cloud p 3224788 html 前言 之前对kmp算法虽然了解它的原理 xff0c 即求出P0 Pi的最大相同前后缀长度k xff1b 但是问题在于如何求出这个最大
  • 【python】*与** 参数问题

    原文地址 xff1a https www cnblogs com paulwinflo p 5764748 html 可变参数 在Python函数中 xff0c 还可以定义可变参数 顾名思义 xff0c 可变参数就是传入的参数个数是可变的
  • 计算机网络编程知识总结

    博客出处 xff1a http www cnblogs com maybe2030 阅读目录 1 网络层次划分 2 OSI七层网络模型 3 IP地址 4 子网掩码及网络划分 5 ARP RARP协议 6 路由选择协议 7 TCP IP协议
  • 机器学习——决策树(decision tree)

    相关文章链接 xff1a 机器学习 人工神经网络 xff08 NN xff09 机器学习 卷积神经网络 xff08 CNN xff09 机器学习 循环神经网络 xff08 RNN xff09 机器学习 长短期记忆 xff08 LSTM xf
  • 基于UDP的Winsock编程(C++版)

    基于UDP的Winsock编程与基于TCP的Winsock编程相比 xff0c 只是缺少了一个步骤而已 对于Server xff0c 缺少了接受连接的过程 xff08 accept 函数调用 xff09 xff1b 对于Client xff
  • Using insecure protocols with repositories, without explicit opt-in, is unsupported. Switch Maven re

    Using insecure protocols with repositories without explicit opt in is unsupported Switch Maven repository maven4 http ma
  • 解析APK的AndroidManifest.xml

    将apk重命名zip解压后获取的AndroidManifest xml是加密后的 xff0c 如果需要看到里边的具体的内容信息 xff0c 需要使用AXMLPrinter2 jar来进行 1 网上下载工具AXMLPrinter2 jar工具
  • unity Symbolicate Android crash

    参考链接 https support unity com hc en us articles 115000292166 Symbolicate Android crash https docs unity3d com Packages co
  • 【无标题】

    Starting a Gradle Daemon 1 incompatible Daemon could not be reused use status for details Configure project launcher WAR
  • unity里生成的.csproj和.sln :assembly definition

    有一段时间一直没明白为啥有的时候第三方的package里的代码没法引用我们项目的 最近有点心得 记录下 在创建unity项目的时候默认是创建一个解决方案就是以 sln为结尾的 默认开发时都在同一个解决项目里 所以不会出现相互引用不到的问题
  • Jenkins 报错: command not found

    主要是路径问题 xff0c Jenkins无法识别 在一台 macOS 的 anget 中 xff0c 我们的 pipeline 脚本一直报错 xff1a cmake command not found xff0c 但实际系统中已经通过 b

随机推荐