C++ template 声明与定义】的更多相关文章

今天编码的时候,发现了一个错误,就是模板代码在链接的时候找不到方法. 情况大概如下: 在 "Manager.h" 中 class Manager { public: template<typename T> void SetData(const T& value); }; 然后在cpp文件中定义SetData template<typename T> void Manager::SetData(const T& value) { } 在另外一个m…
最近在仿写stl,发现stl源码中将模板的声明与定义写在一起实在很不优雅.自己尝试用“传统”方法,及在.h文件里声明,在.cpp文件里定义,然后在main函数里包含.h头文件,这样会报链接错误.这是因为函数模板要被实例化后才能成为真正的函数,在使用函数模板的源文件中包含函数模板的头文件,如果该头文件中只有声明,没有定义,那编译器无法实例化该模板,最终导致链接错误. 上面这句话有点抽象.要理解为什么会出错,首先要理解用传统方法写非模板函数时,编译器是怎么运作的.举个例子 //-----------…
目录 1 参考 2 概念 2.1 声明 2.2 定义 3 对比 3.1 声明但不是定义的情况 3.2 声明且是定义的情况 3.3 特殊情况 1. 参考 1. <C++程序设计语言>4.9 2. <C++Primer>2.3.5 3. http://bbs.csdn.net/topics/190026622 2. 概念 2.1 声明               声明用于向程序表明变量的类型和名字.(引自参考2) 2.2 定义   变量的定义用于为变量分配存储空间,还可以为变量指定初始…
c++模板类成员的声明和定义应该都放在*.h中,有普通类不一样. 如果定义放在*.cpp中,最终链接时,会报方法undefined错误. 参考:http://users.cis.fiu.edu/~weiss/Deltoid/vcstl/templates 如果非要定义在*.cpp中,一定要具体化模板类型,如下,但这样意味着你要定义无数个. 所以还是放在*.h中吧,用到的地方,编译器会帮你定义具体类型的方法. // error template<typename T> A<T>::f…
将模板的声明与定义写在一起实在很不优雅.尝试用“传统”方法,及在.h文件里声明,在.cpp文件里定义, 然后在main函数里包含.h头文件,这样会报链接错误.why!!!!!!!!!!!!! 这是因为函数模板要被实例化后才能成为真正的函数,在使用函数模板的源文件中包含函数模板的头文件,(carefully!!!) 如果该头文件中只有声明,没有定义,那编译器无法实例化该模板,最终导致链接错误.(类模板同样!!) //---------------test.h-------------------/…
编译器在编译模板时,并不会生成代码,只有遇到实例化的时候才会生成代码.因此,当我们只引用模板声明文件的时候,在实例化的对象时候,模板的定义问文件是不可见的,于是出现链接错误.例如: //A.h #pragma once template<typename T> class A{ public: A(); ~A(); }; //A.cpp #include"A.h" template<typename T> A<T>::A(){ } template&…
1. 一个类: 头文件用于保存类的声明:定义文件保存类的实现.   2. 分离编译模式: 允许在一个编译单元(.cpp文件)中定义函数.类型.类对象等,然后在另一个编译单元中引用它们.编译器处理完所有的编译单元后,链接器接下来会处理所有指向extern符号的引用(有时为缺省),从而生成单一可执行文件.   3. 模板类型: 模板类型不是一种实类型,它必须等到类型绑定后才能确定最终类型,所以在实例化一个模板时,必须要能够让编译器“看到”在哪里使用了模板,而且必须看到模板确切的定义,而不仅仅是它们的…
我们用C++写类的时候,通常会将.cpp和.h文件分开写,即实现和声明分开写了:但在C++的类模板中,这种写法是错误的. 在<C++编程思想>的第16章的"16.3模板语法"一节给出了答案,以下是下书中原话: 即使是在创建非内联函数定义时,我们还是通常想把模板的所有声明都放入一个头文件中.这似乎违背了通常的头文件规则:"不要放置分配存储空间的任何东西"(这条规矩是为了防止在连接期间的多重定义错误),但模板定义很特殊.由template<->…
这里的问题实质是我们在头文件中直接定义全局变量或者函数,却分别在主函数和对应的cpp文件中包含了两次,于是在编译的时候这个变量或者函数被定义了两次,问题就出现了,因此,我们应该形成一种编码风格,即: 在一个头文件中要想定义一个全局变量,除非我们能够保证这个头文件仅仅只被一个cpp文件包含(也就是main函数所在的那个cpp文件),否则,我们都应该将对应的定义放在这个头文件对应的cpp文件中,仅仅在这个头文件中声明他,这样才能够保证这个变量不被重定义 下面是我找出问题的博客,转载自:C++中重定义…
声明和定义是完全同的概念,声明是告诉编译器"这个函数或者变量可以在哪找到,它的模样像什么".而定义则是告诉编译器,"在这里建立变量或函数",并且为它们分配内存空间. 函数声明与定义: 函数的声明如:int Add(int, int);函数声明就是给函数取名并指定函数的参数类型,返回值类型.值得注意的是,在C语言中,有一点跟C++不同,对于带空参数表的函数如:int func():在C中代表可以带任意参数(任意类型,任意数量),而在C++中代表不带任何参数. 函数的定…
在讨论全局变量之前我们先要明白几个基本的概念: 1. 编译单元(模块):    在IDE开发工具大行其道的今天,对于编译的一些概念很多人已经不再清楚了,很多程序员最怕的就是处理连接错误(LINK ERROR), 因为它不像编译错误那样可以给出你程序错误的具体位置,你常常对这种错误感到懊恼,但是如果你经常使用gcc,makefile等工具在linux或者嵌 入式下做开发工作的话,那么你可能非常的理解编译与连接的区别!当在VC这样的开发工具上编写完代码,点击编译按钮准备生成exe文件时,VC其实做了…
含义 声明(Declaration), 用于告诉编译器被声明的函数/变量的存在, 及它们的类型/调用格式信息, 以检查是否被正确调用. 声明不分配内存空间. 定义(Definition), 用于告诉编译器被声明的函数/变量的存在位置, 会分配内存空间. 变量/函数在被使用之前一定要被声明. 声明和定义可以同时进行. 可以有多个声明, 但只能有一个定义. 函数的声明与定义 函数的Declaration由函数的签名(函数名+参数列表)与return类型, 外加一个分号组成. 如: void fn(i…
以下代码使用平台是VS2012. 清楚明白声明与定义是一名合格的程序猿的基本要求. 本人认为,C++编码过程中谈及"声明"和"定义"是因为我们要使用一个变量.类型(类.结构体.枚举.共用体)或者函数,因此有申明和定义变量.类型和函数之说.C/C++中,使用一个变量.类型或者函数必须先在使用前申明它. 请记住: (1)"声明"与"定义"的本质区别是:声明可以出现多次,而定义只能出现一次. (2)把申明的东西放在头文件,把定义的东…
switch语句下的变量声明和定义的问题: switch...case...语句中存在声明和定义会出现一些问题.这个由switch语法特性决定的, switch中每个case都是平等的层次,区别于一般的if else语句,我们知道swich的case语句可以这样写: switch (i) { case 1: case 2: int n = 0; break; case 3: break; default: break; } 所以整个switch语句处在同一个代码块中,只不过有多个case语句,既…
<C++Primer>第四版 2.3.5节中这么说到: ①变量定义:用于为变量分配存储空间,还可为变量指定初始值.程序中,变量有且仅有一个定义. ②变量声明:用于向程序表明变量的类型和名字. ③定义也是声明:当定义变量时我们声明了它的类型和名字. ④extern关键字:通过使用extern关键字声明变量名而不定义它. 1.定义也是声明,分配了存储空间:而extern声明不是定义,即不分配存储空间.extern告诉编译器变量在其他地方定义了. 例如:extern int i; //声明,不是定义…
C/C++:[2]enum-枚举量声明.定义和使用 转自:http://jingyan.baidu.com/article/e75aca85526c1b142edac6d9.html 众所周知,C/C++语言可以使用#define和const创建符号常量,而使用enum工具不仅能够创建符号常量,还能定义新的数据类型,但是必须按照一定的规则进行,下面我们一起看下enum的使用方法.   工具/原料 Microsoft Visual Studio 2012(或其他版本) 步骤1——枚举量的声明和定义…
仅从形式上看,C程序就是由各种声明和定义组成的.它们是程序的骨架和外表,不仅定义了数据(变量),还定义了行为(函数).规范中的纯语言部分,声明和定义亦花去了最多的篇幅.完全说清定义的语法比较困难,这里也只是个人的理解. 1. 标识属性 对C编译器而言,标识(identifier)包括对象名.函数名.复合类型及枚举tag.typedef类型名.label和枚举常量.标识的各种属性构成了C的复杂功能,理清这些概念对C的高级使用尤其重要. 域(scope)可以看做是标识的活动范围,一个编译单元中该范围…
序 声明和定义是我们使用的基础,但是对于声明和定义的概念,我们不甚了了,也就是说感觉好像是这样,但是真要详细说明就说不上来. 有博主对于声明和定义有以下描述:          1.需要建立存储空间的.例如:int a 在声明的时候就已经建立了存储空间. "定义性声明(defining declaration)"或者称为"定义(definition)".          2.不需要建立存储空间的. 例如:extern int a 其中变量a是在别的文件中定义的.…
基础学了太久,时间一长有些东西就可能记得不太清楚,俗话说得好,"好记性不如烂笔头",所以把基础中的基础-变量的声明和定义,从C到编译原理到C++,再到Java用烂笔头记录下来 最早在编程语言中认识声明和定义是在学C语言的时候... C语言中:如extern User user:extern int a;就是声明,变量的声明就是仅仅告诉编译器,声明的变量的存在,要预留一点空间,但并不为其分配内存.定义就是声明这个变量并真正在内存(堆或栈中)为此变量分配空间. 从编译原理上来说,声明就是仅…
OC中设计一个类的步骤: 一.声明类: 1.用到的关键字--@interface 和 @end 2.类名 3.继承NSObject 4.属性 5.方法(行为,只需要声明) 二.实现(定义)类 1.用到的关键字--@implementation 和 @end 2.实现@interface中声明的方法 3.类中方法的声明和实现一定注意开头写减号“-” 4.OC类中的小括号不能乱用,小括号是用来括住类型的!--谨记! 例: 下面的代码中声明和定义的类,类中的方法没有返回值,没有参数 * 实现@inte…
(1)编译单元(模块)     在VC或VS上编写完代码,点击编译按钮准备生成exe文件时,编译器做了两步工作: 第一步,将每个.cpp(.c)和相应的.h文件编译成obj文件: 第二步,将工程中所有的obj文件进行LINK,生成最终.exe文件.       那么,错误可能在两个地方产生: 一个,编译时的错误,这个主要是语法错误: 一个,链接时的错误,主要是重复定义变量等.          编译单元指在编译阶段生成的每个obj文件.     一个obj文件就是一个编译单元.     一个.c…
c++声明与定义 声明是将一个名称引入程序.定义提供了一个实体在程序中的唯一描述.声明和定义有时是同时存在的. 如 int  a; extern int b=1; 只有当extern中不存在初始化才是声明.其他情况既是定义也是声明. 但是在下列情况下,声明仅仅是声明: 1:仅仅提供函数原型.如void func(int,int); 2: extern int a; 3:class A: 4:typedef声明 5:在类中定义的静态数据成员的声明 class A { public: static…
在上一讲中,简单介绍了函数的定义和使用,只要你想完成一个新功能,首先想到的应该是定义一个新的函数来完成这个功能.这讲继续介绍函数的其他用法和注意事项. 一.函数的声明 1.在C语言中,函数的定义顺序是有讲究的:默认情况下,只有后面定义的函数才可以调用前面定义过的函数 1 int sum(int a, int b) { 2 return a + b; 3 } 4 5 int main() 6 { 7 int c = sum(1, 4); 8 return 0; 9 } 第5行定义的main函数调用…
C++学了这么多年你知道为什么定义类时,类的定义放在.h文件中,而类的实现放在cpp文件中.它们为什么能够关联到一起呢?你知道什么东西可以放在.h文件中,什么不能.什么东西又可以放在cpp文件中.如果你忘记了或是压根就不明白,那么读过此文你会清晰无比!! 首先谈下声明与定义的区别. 声明是将一个名称引入程序.定义提供了一个实体在程序中的唯一描述.声明和定义有时是同时存在的. 如int  a; extern int b=1; 只有当extern中不存在初始化式是才是声明.其他情况既是定义也是声明.…
6.2  类:当C++爱上面向对象 类这个概念是面向对象思想在C++中的具体体现:它既是封装的结果,同时也是继承和多态的载体.因此,要想学习C++中的面向对象程序设计,也就必须从“类”开始. 6.2.1  类的声明和定义 面向对象思想把现实世界中的所有事物都看成是对象,而类是对所有相同类型对象的抽象,是对它们总体的一个描述.比如,学校有很多老师,张老师.李老师.王老师,虽然每个老师各不相同,是不同的对象个体.但他们都是老师这一类型的对象,有着共同的属性(都有姓名.职务)和相同的行为(都能上课.批…
#include <iostream> #include <list> #include <string> using namespace std; class Employee { string family_name; short department; public: Employee(const string& name,int dept); virtual void print() const; }; Employee::Employee(const…
第5章 用函数封装程序功能 在完成功能强大的工资程序V1.0之后,我们信心倍增,开始向C++世界的更深远处探索. 现在,我们可以用各种数据类型定义变量来表达问题中所涉及的各种数据:用操作符连接这些变量对其进行运算:用程序流程控制结构来控制对这些数据的复杂处理过程,最终实现对数据进行处理得到结果,而这就是程序了.但是,随着要处理的问题越来越复杂,程序的代码自然也就会越来越复杂.如果把所有程序代码都放到main()主函数中,主函数也会越来越复杂.这就像将所有东西都堆放到一个仓库中,随着东西越堆越多,…
什么是变量?变量或者叫对象,是一个有具名的.可以供程序操作的存储空间.这里具名是指变量是有名字的,可供操作是指能进行加减乘除或者输入输出等操作,存储空间则是指有一块属于它的内存空间. 为了便于说明,标题和后面的内容将对象分为两种.对于内置的,文章称作为变量,对于自定义的,称之为对象. 第一个问题:在C++中,什么是定义,什么是声明? ①定义:用于为变量分配存储空间,还可为变量指定初始值.在程序中,变量有且仅有一个定义. ②声明:用于向程序表明变量的类型和名字.在程序中,变量可以有多个声明. 定义…
在程序设计中,时时刻刻都用到变量的定义和变量的声明,可有些时候我们对这个概念不是很清楚,知道它是怎么用,但却不知是怎么一会事. 下面我就简单的把他们的区别介绍如下: 变量的声明有两种情况: (1)一种是需要建立存储空间的(定义.声明). 例如:int a在声明的时候就已经建立了存储空间. (2)另一种是不需要建立存储空间的(声明). 例如:extern int a其中变量a是在别的文件中定义的. 分析:前者是"定义性声明(defining declaration)"或者称为"…
变量声明和定义的区别 我们在程序设计中,时时刻刻都用到变量的定义和变量的声明,可有些时候我们对这个概念不是很清楚,知道它是怎么用,但却不知是怎么一会事,下面我就简单的把他们的区别介绍如下:(望我的指点对你受益) 变量的声明有两种情况: 1.一种是需要建立存储空间的.例如:int a 在声明的时候就已经建立了存储空间. 2.另一种是不需要建立存储空间的. 例如:extern int a 其中变量a是在别的文件中定义的. 前者是“定义性声明(defining declaration)”或者称为“定义…