为什么模板类的声明和实现必须定义在一个.h文件中?

”模板类的实现,脱离具体的使用,是无法单独的编译的;把声明和实现分开的做法也是不可取的,必须把实现全部写在头文件里面。“这个的原理是啥啊,越详细越好。

c++
0

4个回答

0

1.链接的时候,需要实例化模板,这时候就需要找模板的具体实现了。假设在main函数中调用了一个模板函数,这时候就需要去实例化该类型的模板。注意main函数里面只包含了.h文件,也就是只有模板的声明,没有具体实现。就会报错。
2.而模板的实现.cpp里面,虽然有模板的具体实现,但是没有谁在该.cpp里面使用一个模板函数,就不会生成一个具体化的实例。

我搞懂了

0

这个是编译器实现的限制,理论上也是可以做到模板分离的

0

“而模板的实现.cpp里面,虽然有模板的具体实现,但是没有谁在该.cpp里面使用一个模板函数,就不会生成一个具体化的实例”,这句话还是不太理解,我觉得main函数应该显示指定了类型,然后去调具体的函数。

0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
模板函数声明与定义全都要放在.h文件中?为何不可以分开写?
诡异
类模板的声明与实现要在同一个文件中
       最近在学数据结构的一些东西,编写顺序表的时候遇到了一个问题,困扰良久,就是类模板声明与实现的问题。笔者开始是根据书上的步骤来敲代码,可是在编译的时候确出现了问题,检查了很多遍,发现自己写的和书上的一个标点符号都没有错,后来在网上大神的帮助下解决了这个问题,现在就和大家分享一下我的经验,直接上代码:.h文件://顺序表的类声明 #define defaultSize 100 templ...
C++中,模板类的实现放在.h中的原因
C++标准明确表示,当一个模板不被用到的时侯它就不该被实例化出来;   模板定义很特殊。由template<…> 处理的任何东西都意味着编译器在当时不为它分配存储空间,它一直处于等待状态直到被一个模板实例告知。在编译器和连接器的某一处,有一机制能去掉指定模板的多重定义。所以为了容易使用,几乎总是在头文件中放置全部的模板声明和定义。 "对C++编译器而言,当调用函数的时候,编译器只...
C++模板类的成员函数定义与声明必须在一个头文件中
今天编写数组链表的程序,出现了一个问题,我在ArrayList.h中定义了一个模板类ArrayList,然后按照原来的习惯,在另一个源文件ArrayList.cpp中对模板类的成员函数进行定义,编译也通过了,但是当我在main函数对模板类进行实例化时,编译器报错,显示为成员函数undefined,就是说我的成员函数未定义,这就让我纳闷了。 我试着将构造函数的定义移到头文件里去,再编译,运行,成功
[C++]为什么模板函数的声明与实现都放在.h头文件中
  原文:http://www.360doc.com/content/13/0722/14/10072361_301717293.shtml   当你不使用这个模版函数或模版类,编译器并不实例化它 ,当你使用时,编译器需要实例化它,    因为编译器是一次只能处理一个编译单元, 也就是一次处理一个cpp文件,所以实例化时需要看到该模板的完整定义 .    所以都放在头文件中       ...
C++将模板的声明和定义放置在同一个头文件里
1. 一个类: 头文件用于保存类的声明;定义文件保存类的实现。 2. 分离编译模式: 允许在一个编译单元(.cpp文件)中定义函数、类型、类对象等,然后在另一个编译单元中引用它们。编译器处理完所有的编译单元后,链接器接下来会处理所有指向extern符号的引用(有时为缺省),从而生成单一可执行文件。 3. 模板类型: 模板类型不是一种实类型,它必须等到类型绑定后才能确定最终
C++模板类声明和实现分离
1.声明部分 //point.h [cpp] view plain copy 1.#ifndef POINT 2.#define POINT 3. 4.template class Point 5.{ 6.public: 7. Point(Elem); 8.} 9.; 10.#endif 2.实现部分 //point.cpp [cpp] view plai...
模板类的定义和实现不能分开,只能写在.h中,否则链接的时候会报错
遇到了这个问题。 网上查的的解决方法: http://bbs.csdn.net/topics/70416260 注意c/c++模板的定义和实现- -                                         定义一个类一般都是在头文件中进行类声明,在cpp文件中实现,但使用模板时应注意目前的C++编译器还无法分离编译,最好将实现代码和声明代码均放在头文件
C++ 模板类的实现为何放在.h中
主要原因:C++标准明确表示,当一个模板不被用到的时侯它就不该被实例化出来; 如以下代码:main.cpp中调用到模板类A的方法A::f,因A::f在test.cpp中实现,编译器在#1处并不知道A::f的定义,故寄希望于连接器,实际上test.cpp编译出来的test.obj文件中关于A::f一行二进制代码也没有,因为模板类A在test.cpp未被实例化,此时连接器就会报错。所以,必须把模板类
模板类的定义和声明为何要写在一起
转自 前言 常遇到询问使用模板到底是否容易的问题,我的回答是:“模板的使用是容易的,但组织编写却不容易”。看看我们几乎每天都能遇到的模板类吧,如STL, ATL, WTL, 以及Boost的模板类,都能体会到这样的滋味:接口简单,操作复杂。 我在5年前开始使用模板,那时我看到了MFC的容器类。直到去年我还没有必要自己编写模板类。可是在我需要自己编写模板类时,我首先遇到的事
模板类的定义和实现可以不在同一个文件中
写c++程序时我们经常会把函数的定义写在xxx.h中,把函数的实现写在xxx.cpp, 但是当我们写带模版的函数和类时,这样写 就会出现问题,如下: stack.h //stack.h #ifndef STACK_HPP #define STACK_HPP #include #include template> class CStack { public: void push(co
06泛型编程--类模板函数实现写在类外且分开成.hpp和.h文件
.hpp文件是对.h文件做的补充和解析,两个文件要一起使用,通常调用的时候包含.hpp文件,.hpp文件包含.h文件 //template.h #pragma once #include #include using namespace std; template class Complex { public: friend ostream& operator(ostream &out
C++ 在.h文件中声明,在.cpp文件中定义 模板函数和模板类
C++ 需要模板函数的定义和声明要放在一起,这样才能根据调用需要选择编译具体的实例。如果我们需要多种实例,每个实例要编译一次,就需要编译多次。在模板函数实现妥当以后,当我们在其它文件中使用某些模板函数的时候,基本所有实例都会被重新编译。如果每次编译时间过长,势必会停滞我们的思维,拖长开发进度。所以在模板函数实现妥当以后,我们希望他只编译一次,在非当前模块被修改时,他也不会被重新编译。这篇博客就是介绍
为什么C++模板声明与定义要放在同一文件中?
写了3年多C++程序,很少用到模板,我靠,今天想试一下,照着别人的例子写,什么鬼,怎么都运行不过,仔细比对代码才发现,C++模板的声明与定义必须放到一个文件,.h或者.hpp, 真是颠覆我对C++编程的认知,什么坑爹的语法。网上找资料,看博客,看书,才知道必须这样写,太坑了。 例如我写的一个A 模板类,A.h文件: #pragma once #include &...
模板类:函数实现(.cpp)和函数声明(.h)分开的问题
关于模板类:函数实现(.cpp)和函数声明(.h)分开的问题已经是个老问题了,一般不能分开编写,否则编译出错,原因不多说。 但是caffe编写的声明和实现分开了,而且还不冲突,原因就是使用了类模板实例化了。
C++的模板为什么要在头文件(.h)中实现?
今天是个科普文:C++的模板为什么要在头文件(.h)中实现? 模板的用途 这个事情其实我没什么发言权,实话实说,我写模板比较少。对于模板的重要性,也是最近才感觉到。至于模板的重要性,这里也不多说,自己悟。 模板编写 这里就举个函数模板的例子(我们把实现放在.cpp的错误例子): lp_max.h template T max(cons
c++中模板类的成员函数的声明与定义应该放在头文件里
今天尝试自己实现vector数据结构底层,在定义vector模板类的时候,还想像往常一样把类分为.h文件和.cpp文件,把成员函数的声明放在.h文件中,把具体实现放在.cpp文件中,结果在测试时发现在编译过程中报错。调试了很久,重视提示“无法解析的外部符号”,如图所示:                           最终我找到了原因: 引用C++primer的话:C++支持两种模板编译...
[C++]模板类的声明与实现分离问题
本文,记录C++模板类的实现。 目的:实现一个bag类 做法:模板类bag的声明与实现分离,也就是.cpp和.h文件分离 此时,编译失败。 将.cpp和.h取消(亦即取消声明与实现的分离) 此时,编译成功,运行正常。 马上查找资料,收集整理如下: C++ 中的模板类声明头文件和实现文件分离后,如何能实现正常编译? ,链接Splitting temp
模板函数的声明和定义为何不能分开放在两个文件中?
首先明确: 对普通函数来说,声明放在头文件中,定义放在源文件中,其它的地方要使用该函数时,仅需要包含头文件即可,因为编译器编译时是以一个源文件作为单元编译的,当它遇到不在本文件中定义的函数时,若能够找到其声明,则会将此符号放在本编译单元的外部符号表中,链接的时候自然就可以找到该符号的定义了。 而对模板函数来说,首先明确,模板函数是在编译器遇到使用模板的代码时才将模板函数实例
为什么模板类与模板成员函数不能分文件写(.h与.cpp)
定义一个类一般都是在头文件中进行类声明,在cpp文件中实现,但使用模板时应注意目前的C++编译器还无法分离编译,最好将实现代码和声明代码均放在头文件中。如: test.h template <class T> class CTest { public: T& GetValue(); void SetValue(const T&a...
你所不知道的事儿--C++类模板的声明和实现不能分离
也许你具有良好的编程习惯,在定义一个类的时候总会把声明和实现分离开,位于不同的文件中。比如你定义一个类A,首先创建一个.h文件,代码如下:class A { public: A(int b); void show(); ~A(); private: int a; }接下来你创建一个.cpp文件实现类的声明,代码如下:#include"classA.h" #includ
C++ 为什么模板只能在头文件中实现?
模板类的定义和实现必须要在同一个文件中,通常是头文件,编译器要看到模板实现才能展开模板。 因为初始化一个模板,编译器根据模板的参数创建一个新的类。比如: templatestruct Foo{ T bar; void doSomething(T param) {/* do stuff using T /}}; // somewhere in a .cpp Foo f;  编译器在
C++模板类代码只能写在头文件?
这个问题,实际上我几年前就遇到了。最近写个模板类玩的时候,再次遇到。  当我非常仔细的将定义和实现分开,在头文件中保留了最少的依赖后,一切就绪.cpp单独编过。但是当使用的时候,就会报告所有的函数调用都没有实现。按常规.h/.cpp而言这是不可能的。但是模板类就是这么独特。简单说说他的原因,也备自己将来遗忘:  从语法角度而言,是没有强制要求说模板代码的声明和实现不可以分开。那么当分离的声明和实现写
C++中模板类的声明和实现分离问题
C++中模板类的声明和实现分离问题
C++ 模板类的声明与实现分离问题(模板实例化)
模板实例化有什么好处? 减少编译时间。 使得类定义与实现分离。 减少编译时间 一般来说,如果你的项目没有混合使用 C 和 C++ 语言,那么你使用 .h 和 .cpp 是没有问题的。否则你将C和C++的头文件进行分离,因为通常我们把C和C++分离编译,再统一链接。 函数经过编译系统的翻译成汇编,函数名对应着汇编标号。 因为C编译函数名与得到的汇编代号基本一样,如:fun()=&gt...
c++类的模板成员函数申明和实现必须放在一起
解释如下: C++中每一个对象所占用的空间大小,是在编译的时候就确定的,在模板类没有真正的被使用之前,编译器是无法知道,模板类中使用模板类型的对象的所占用的空间的大小的。只有模板被真正使用的时候,编译器才知道,模板套用的是什么类型,应该分配多少空间。这也就是模板类为什么只是称之为模板,而不是泛型的缘故。 既然是在编译的时候,根据套用的不同类型进行编译,那么,套用不同类型的模板类实际上就是两
由类模版中static成员变量的定义引发的思考。。。
说到这个问题还要从一个项目说起,项目中整个系统的日志部分是通过单例模式进行管理的,在设计单例模式的时候,单例类的定义是定义成模版类,且为了实现每个单例类只能有一个实例,实例化返回的对象设计成静态成员变量,如下图Fig 1所示。  Fig 1.单例模式的定义 由于代码正常习惯,类的定义和实现是分开的,分别在.h和.cpp文件中,所以在设计的时候也是分开的,后来就悲剧了,编译的时候怎么都是
C++类模板 .h和.cpp文件要写在一起||要在主函数main中用#include "Test.h" Test是模板类名
最好要将C++类模板的.h和.cpp文件的内容一起写在.h文件中,不要分开 C++模板类和模板函数示例: 模板类Test Test.h #pragma once #include using namespace std; template class Test { public: T a; public: Test(T a); ~Test(); void printT(); };
C++类模板声明与实现分离
当模板声明与实现分离未处理得当时,会出现链接错误,如下: error LNK2019: unresolved external symbol poisson referenced 其实,LNK2019错误一般都是 compile是能找到相应的header (.h)文件,但链接时找不到相应的 lib 库文件(也含dll文件)。 首先,对编译器来说模板的声明与实现并不能真正的分离,我们要
模板类和模板函数的声明和定义分开文件写的方法
据说模板类和模板函数的声明和定义要写在同一个文件。
为什么不能将类模板的声明与类模板函数实现分开写?
定义一个类一般都是在头文件中进行类声明,在cpp文件中实现,但使用模板时应注意目前的C++编译器还无法分离编译,最好将实现代码和声明代码均放在头 文件中。如: test.h template class CTest {   public:           T& GetValue();           void SetValue(const T& _Value);
关于函数在.c文件定义在.h文件声明与makefile
正确写法: aaa.h: #ifndef AAA_H #define AAA_H void pri(); #endif aaa.c: #include "aaa.h" #include void pri() {     printf("aaaaa\n"); } main.c: #include "aaa.h" int main() {     pri();
c/c++模板的定义和实现分开的问题(一)
注意c/c++模板的定义和实现- -                                         定义一个类一般都是在头文件中进行类声明,在cpp文件中实现,但使用模板时应注意目前的C++编译器还无法分离编译,最好将实现代码和声明代码均放在头文件中。如: test.h templateclass CTest{ public:    T& GetValue(); 
关于模板函数声明与定义的问题
c++ primer上说:c++模板函数的声明与定义通常放在头文件中,而普通的函数通常是声明放在头文件中,定义放在源文件中,为什么会有这样的区别呢?模板函数与普通成员函数到底有什么区别? 测试代码: tem.h #ifndef _TEM_H #define _TEM_H template T add(T a,T b); //{ //return a+b; //}
为什么类的定义和实现分开存放在.h和.cpp中
如果把类的所有代码都内联定义到头文件中,那么所有需要用到这个类的CPP文件实际上都包含了更多的代码,编译器编译每个这样的CPP文件时都编译了这些代码。而分开定义,这些代码就只被编译了一遍,也就是在编译实现那个类的CPP文件时。...
不能将类模板的声明与实现分开写
今天用类模型实现一个linklist,开始是.h和.cpp将类模板的声明与实现分开写的,结果总是报错: 摆弄了半个小时都不知道为啥,结果一百度,原来类模板的声明与实现是不能够分开写的。《C++编程思想》第15章(第300页)说明了原因: 模板定义很特殊。由template<…> 处理的任何东西都意味着编译器在当时不为它分配存储空间,它一直处于等待状态直到被一个模板实例告知。在编译器和连接器的
c++ 模版函数的定义和实现必须放在一个文件中
今天使用模版函数,遇到一个问题。 当我定义一个类,并且将它的一个成员函数定义为模版类型时,需要将该模版函数的实现与该类放在一个文件中。 比如在a.h中定义了class a: [html] view plaincopy class a   {       ...       templatetypename T> a(const 
C++模板类声明和定义几种写法
为什么模板类的实现放在cpp会出错 在编译用到了模板类的编译单元时,编译器需要访问方法或者类的实现,以实例化它们。 如果这些实现不在头文件中,则它们将不可访问,因此编译器将无法实例化模板,进而会导致编译出错。 模板类的定义必须放在.h文件中吗 答案是否定的,模板类的几种写法 声明和定义都放在.h中 // Foo.h template &amp;amp;amp;amp;lt;typename T&amp;amp;amp;amp;gt; struct Foo { ...
c++中模板_类模板的声明和定义
一、函数模板用法 1.1申明和定义 Ø  在函数申明和定义前面,加一个模板templateclass T, class C>就行,其余正常定义和申明 Ø  调用时,跟正常函数一样调用 注意: Ø  模板在调用时,才确定参数的具体类型!!! Ø  模板的声明或定义只能在全局,命名空间或类范围内进行。即不能在局部范围,函数内进行,比如不能在main函数中声明或定义一个模板 1.2调用
编程规则中为何要求不能在.h文件中定义变量
问题背景:当你接触C语言时,老师一定会强调一个编程规则:永远不要在.h文件中定义变量 疑惑点:是不是说在.h文件中定义会出错? 结论:在.h文件中定义变量不会报错,但是该操作会导致在多个模块中重复定义该同名变量【变量名相同,但地址不同】,与软件逻辑不一致。 分析: 1):知识概要 1&amp;gt; 定义变量和声明变量的区别是定义会产生内存的分配,而申明则不会产生内存的分配,而是告...
文章热词 机器学习教程 Objective-C培训 交互设计视频教程 颜色模型 设计制作学习
相关热词 mysql关联查询两次本表 native底部 react extjs glyph 图标 钱学森班h人工智能h java定义一个班级类