多维的CStringArray的定义要与CArray模板类一起使用//这种定义多维的<>的使用格式是按照什么原理定义的? CArray两个模板参数,一个是存储数据的类型,一个是返回数据的类型。比如说存储int,返回也用int,那就是:CArray,int>;如果想要返回int&,那就是:CArray,int&>;返回引用可以减少拷贝次数。放到这里道理也是一样的,定义CStringArray的数据,就是:CArray,CStringArray&>;其他的依此类推
C++中,把类的定义和实现都放在.h文件中,有什么好处和坏处? 最近我看了一个美国大牛写的代码,把类的定义和实现,都放在同一个.h文件中了,整个工程都是由.h文件构成,…
为什么模板函数的声明与实现都放在.h文件中 当你不使用这个模版函数或模版类,编译器并不实例化它,当你使用时,编译器需要实例化它,因为编译器是一次只能处理一个编译单元,也就是一次处理一个cpp文件,所以实例化时需要看到该模板的完整定义.所以都放在头文件中 这不同于普通的函数,在使用普通的函数时,编译时只需看到该函数的声明即可编译,而在链接时由链接器来确定该函数的其实模板实现不能放在cpp文件中,主要就是CPP在c++编译期间不能决定模板参数的类型,所以不能生成模板函数的实例,所以他会把模板类型带到链接期间,如果这个期间有函数调用了该实例,这个时候由于没有把模板实例到特定类型,就会导致编译错误。
C++类模板的声明和定义为什么要放在同一个文件? 也不是只能放在.h里面,但是推荐放在.h里面。STL模板实现全部是放在.h里面的。编译能通过。1)参与编译的只是.cpp文件,不会报错的原因,是因为它能在.h里面找到模板的声明。链接错误。1)链接的时候,需要实例化模板,这时候就需要找模板的具体实现了。假设在main函数中调用了一个模板函数,这时候就需要去实例化该类型的模板。注意main函数里面只包含了.h文件,也就是只有模板的声明,没有具体实现。就会报错。2)而模板的实现.cpp里面,虽然有模板的具体实现,但是没有谁在该.cpp里面使用一个模板函数,就不会生成一个具体化的实例。ps:模板是在需要的时候,才会去生成一个具体化的实例的,比如,你只要一个int型的实例,模板就只会给你生成一个int型的实例,模板本身是不会被执行的(也就是模板本身不产生汇编指令),是模板生成的具体化实例才产生指令(这个实例是隐藏的,我们是看不到的)解决方案:1)将模板实现写在.h里面2)如果你非要写在.cpp里面,那么请在模板实现的.cpp文件里面(或者.h里面)显式的实例化一个模板。如果是这样的话,那模板就没有太大的意义了,难道你去自己手动实例化所有的实例?
编程时类得定义是放在头文件中吗?类得成员函数呢?
函数的定义和声明为什么要放在一个文件中 对C++编译器而言,当调用函数的时候,编译器只需要看到函数的声明。当定义类类型的对象时,编译器只需要知道类的定义,而不需要知道类的实现代码。因此,因该将类的定义和函数声明放在头文件中,而普通函数和类成员函数的定义放在源文件中。但在处理模板函数和类模板时,问题发生了变化。要进行实例化模板函数和类模板,要求编译器在实例化模板时必须在上下文中可以查看到其定义实体;而反过来,在看到实例化模板之前,编译器对模板的定义体是不处理的—原因很简单,编译器怎么会预先知道 typename 实参是什么呢?因此模板的实例化与定义体必须放到同一翻译单元中。