2019独角兽企业重金招聘Python工程师标准>>>

定义一个类一般都是在头文件中进行类声明,在cpp文件中实现,但使用模板时应注意目前的C++编译器还无法分离编译,最好将实现代码和声明代码均放在头 文件中。如:

test.h

template <class T>
class CTest
{  
public:        
  T& GetValue();        
  void SetValue(const T& _Value);
protected:
  T m_Value;
};

test.cpp

template <class T>
T& CTest<T>::GetValue()
{    
   return m_Value;  
}

template<class T>
void CTest<T>::SetValue(const T& _Value)
{          
   m_Value   =   _Value;  
}

在这儿test.cpp中的内容应放在test.h中,否则在生成最终可执行程序时就会出现错误(在链接时会出错)。因为在编译时模板并不能生成真正的二进制代码,而是在编译调用模板类或函数的CPP文件时才会去找对应的模板声明和实现,在这种情况下编译器是不知道实现模板类或函数的CPP文件的存在,所以它只能找到模板类或函数的声明而找不到实现,而只好创建一个符号寄希望于链接程序找地址。但模板类或函数的实现并不能被编译成二进制代码,结果链接程序找不到地址只好报错了。

《C++编程思想》第15章(第300页)说明了原因:
模板定义很特殊。由template<…> 处理的任何东西都意味着编译器在当时不为它分配存储空间,它一直处于等待状态直到被一个模板实例告知。在编译器和连接器的某一处,有一机制能去掉指定模板的多重定义。所以为了容易使用,几乎总是在头文件中放置全部的模板声明和定义。

转载于:https://my.oschina.net/u/1384842/blog/304912

模板类的声明和定义要放在同一个文件相关推荐

  1. 【C++】模板函数的声明和定义必须在同一个文件中

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

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

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

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

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

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

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

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

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

  6. error LNK2005 --类的声明和定义放在一个文件中

    刷C++primer的时候,将类的声明和定义均放在头文件中,报错error LNK2005 1> Sales_data.h 1>Sales_data.obj : error LNK2005 ...

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

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

  8. Objective-C 2.0 with Cocoa Foundation --- 3,类的声明和定义

    3,类的声明和定义 本系列讲座有着很强的前后相关性,如果你是第一次阅读本篇文章,为了更好的理解本章内容,笔者建议你最好从本系列讲座的第1章开始阅读,请点击这里 . 上一章 我 们写了一个非常简单的Ob ...

  9. Python——类的声明与定义

    类的声明与定义 Python 是一门面向对象的语言.面向对象编程 - Object Oriented Programming(简称 OOP)是一种编程思想,在面向对象编程中,把对象作为程序的基本单元, ...

  10. 【转】C++ 模板类的声明与实现分离问题

    链接如下: https://www.cnblogs.com/tonychen-tobeTopCoder/p/5199655.html

最新文章

  1. WebService大讲堂之Axis2(7):将Spring的装配JavaBean发布成WebService
  2. 【Android 安全】DEX 加密 ( 代理 Application 开发 | 加载 dex 文件 | 将系统的 dexElements 与 应用的 dexElements 合并 | 替换操作 )
  3. CentOS系统如何搭建离线yum源
  4. linux下shell编程
  5. oracle银行卡号检查约束,oracle约束学习(1)unique和check
  6. 每天一道LeetCode-----数独盘求解
  7. 关于读完《软件工程》之后不解的问题
  8. .NET及.NET Core系统架构
  9. 《基于模型的软件开发》——1.2 结构化开发
  10. 首层nginx 传递 二级代理,三级代理......多级代理nginx 客户端真实IP的方法
  11. php mysql bool_关于mysql api中my_bool的取值范围的问题
  12. 线性代数学习笔记(二)
  13. MIMIC-IV数据库介绍与使用说明
  14. 繁星屠龙软件下载_繁星抢币有什么要求 - 天津政务网
  15. HanLP-地名识别调试方法
  16. 【图像识别】基于人工蜂群算法优化卷积神经网络CNN实现图像分类附matlab代码
  17. 实现原理 扫描枪_条码扫描枪的原理
  18. 电脑桌面计算机被隐藏怎么恢复,电脑隐藏图标怎么恢复_电脑隐藏的怎么恢复...
  19. 万网域名怎么做解析教程图解
  20. 1987年,国际C语言混乱代码大赛

热门文章

  1. 快速排序 Vs. 归并排序 Vs. 堆排序——谁才是最强的排序算法
  2. 用Python2编译Python3.X的代码: __future__ 模块
  3. android 音频播放类
  4. json序列化_JSON 序列化和反序列化 In Go
  5. e4a生成r.java错误,编译时候出现英文错误
  6. python3语法糖_python 连续不等式语法糖实例
  7. 蓝桥杯2019年第十届C/C++省赛C组第二题-矩形切割
  8. 模仿QZONE挂图效果
  9. 2017-2018-1 20155320 嵌入式C语言——时钟
  10. 读书笔记(chapter18)