1、问题描述

习惯性的将函数的定义和实现,分别写在头文件和源文件(.cpp)中。今天也按照这个习惯实现了一个模板函数。然后编译时报错

... error: undefined reference to ...
2、原因分析

c++中模板的声明和定义不能分开。C++中每一个对象所占用的空间大小,是在编译的时候就确定的,在模板类没有真正的被使用之前,编译器是无法知道,模板类中使用模板类型的对象的所占用的空间的大小的。只有模板被真正使用的时候,编译器才知道,模板套用的是什么类型,应该分配多少空间。这也就是模板类为什么只是称之为模板,而不是泛型的缘故。
参见博客:https://www.cnblogs.com/jingshikongming/p/9037881.html

3、解决方法

1)将C++模板函数的声明和定义写在头文件中。如果是,类成员函数,可以写在类外面,比较清晰。
2)使用export关键字,在头文件中声明后,在cpp文件中使用export再次修饰下模板函数。但是此方法,不推荐,因为在c++11中已经丢弃不用。
参见:https://zh.cppreference.com/w/cpp/keyword/export

C++ 关键词 export 用法:

C++11 以前:用于标记模板定义为被导出,这允许在其他翻译单元中声明但不定义同一模板。
C++11~C++20:不使用并保留该关键词。
C++20:标记一个声明、一组声明或另一各模块由当前模块所导出。

【C++】模板函数的声明和定义必须在同一个文件中相关推荐

  1. c++模板函数的声明和定义该在什么文件里?

    最近在写模板函数的时候,发现了一个问题. 按照江湖规矩我们的声明一般放在.h文件,定义放在.cpp文件. 而在写模板函数的时候,套用江湖规矩会出错. 解决方法:将模板函数的声明和定义都放在.h文件中. ...

  2. 为什么模板函数的声明和实现都放在.h文件中

    当你不使用这个模板函数或模板类,编译器并不实例化它,当你使用时,编译器需要实例化它,因为编译器是一次只能处理一个编译单元,也就是一次处理一个cpp文件,所以实例化时需要看到该模板的完整定义.所以都放在 ...

  3. 为什么C++模板函数的声明与实现都放在.h文件中

    引用C++primer的话:C++支持两种模板编译模式包含模式(Inclusion   Model )和分离模式(Separation Model) 1. 包含编译模式 在包含编译模式下,在每个模板被 ...

  4. C++模板函数的声明和定义是否可以分开?

    如果按照普通函数一样,将模板函数的声明与定义的分开,声明放在头文件,定义放在cpp文件实现,你会发现,编译没问题,但是在链接阶段会报"undefined references". ...

  5. 为什么C++模板声明与定义要放在同一文件中?

    写了3年多C++程序,很少用到模板,我靠,今天想试一下,照着别人的例子写,什么鬼,怎么都运行不过,仔细比对代码才发现,C++模板的声明与定义必须放到一个文件,.h或者.hpp, 真是颠覆我对C++编程 ...

  6. 内联函数的声明和定义

    一.什么叫inline函数? inline(小心,不是online),翻译成"内联"或"内嵌".意指:当编译器发现某段代码在调用一个内联函数时,它不是去调用该函 ...

  7. C语言详解系列——函数的认识(4)函数的声明与定义,简单练习题

    文章目录 函数的声明与定义 函数的声明 函数的定义 简单的练习题 写一个函数可以判断一个数是不是素数 写一个函数实现二分查找 写一个函数,每调用一次这个函数,就会将 num 的值增加1. 函数的声明与 ...

  8. 静态成员变量与静态成员函数的声明与定义

    类的静态成员变量在类中只能声明,定义和初始化要在类外: class Myclass { private: static int a; // 类内声明 } int Myclass::a = 10; // ...

  9. C语言中变量和函数的声明与定义

    一.变量 在将变量前,先解释一下声明和定义这两个概念.声明一个变量意味着向编译器描述变量的类型,但并不为变量分配存储空间.定义一个变量意味着在声明变量的同时还要为变量分配存储空间.在定义一个变量的同时 ...

最新文章

  1. 适用于Android的OpenSL ES指南-OpenSL ES的Android扩展
  2. my life-long goal
  3. SpringCloud个人笔记-02-Feign初体验
  4. SqlSever分页查询,仅扫描一次表
  5. python变量命名可以有特殊符号吗,和孩子一起学习python之变量命名规则
  6. 基于C#语言的可编程表达式计算器设计
  7. web多线程之webworkers
  8. 仿英雄联盟网页HTML代码 学生网页设计与制作期末作业下载 大学生网页设计与制作成品下载 DW游戏介绍网页作业代码下载
  9. Web前端开发技术实验与实践(第3版)储久良编著实训11
  10. 算计算机一级应用app,计算机一级题库
  11. 3dmax su 简单_Sketchup导入3DSMAX的方法 3DMAX导入SU技巧
  12. Linux内核 失速(STALL) 警告说明文档翻译
  13. 需求预测——Predicting origin-destination ride-sourcing demand with a spatio-temporal encoder-decoder
  14. 文件锁(二)——文件锁的读锁和写锁
  15. Oracle基本认识
  16. Android 插件化之—— 加载插件中的资源
  17. 全方位解读Web3域名:DID基石、NFT新增长点
  18. DEDE:ping服务插件破解版推广信息解密过程实录
  19. STM32系列单片机USB下载程序(ISP编程)
  20. 输入框调用手机键盘的确认按钮

热门文章

  1. 【python】一次移动平均算法
  2. hbase 数据插入指定rowkey_「HBase大爆炸」HBase之常用Shell命令
  3. Mat矩阵基本操作与示例 OpenCV
  4. 在CentOS 6.3 64bit上利用iptables开放指定端口的方法
  5. ATS插件channel_stats源码分析解读
  6. Pip install: ImportError: cannot import name IncompleteRead
  7. 嵌入式系统开发过程中遇到的——volatile
  8. windows下rpc框架thrift的环境配置
  9. P1066 2^k进制数 NOIP 2006 提高组 第四题
  10. 雷林鹏分享:jQuery EasyUI 数据网格 - 创建属性网格