100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > c++模板类声明和定义的问题

c++模板类声明和定义的问题

时间:2021-12-21 15:26:36

相关推荐

c++模板类声明和定义的问题

这里在学习的过程中遇到的一些问题,比较简单,但还是记下来,以免下次遇到这个问题再犯,大佬们可跳过哦。先简单的介绍下模板的概念

C++模板(泛型编程)

c++模板是泛型编程的基础,所谓泛型编程也是一种思想,一种抽象数据类型,但是泛型是不属于面向对象,它是面向对象的补充和发展。使用泛型编程简单来说就是能让你把一些相同的代码用指定的去替换它,算是程序员找到的一个偷懒的方法吧。

模板类和类模板的概念

一个类模板(类生成类)允许用户为类定义个一种模式,使得类中的某些数据成员、默认成员函数的参数,某些成员函数的返回值,能够取任意类型(包括系统预定义的和用户自定义的)。

如果一个类中的数据成员的数据类型不能确定,或者是某个成员函数的参数或返回值的类型不能确定,就必须将此类声明为模板,它的存在不是代表一个具体的、实际的类,而是代表一类类。

类模板定义格式:

template<typename T> //这里的typename也可写成class,是一样的,class是之前程序员们所写的一种方式class Test{private:T n;const T i;public:Test():i(0){}Test(T k);~Test(){}public:void print();T operator+(T x);}

如果是在类外定义成员函数,且这个成员函数中有模板参数存在,那么除了和一般类的类外定义成员函数一样定义,还需要在函数外进行模板声明

例:

template<typename T>void Test<T>::print(){cout<<"n="<<n<<endl; //这里在上面已经添加了iostreamcout<<"i="<<i<<endl;}

template<typename T>Test<T>::Test(T k):i(k) //这里是初始化列表:i(k){n = k;}template<typename T>T Test<T>::operator+(T x){return n+x;}

好了,概念抛个差不多就行了,现在开始抛问题,上图

这种问题呢对于小白来说应该是比较容易犯的一个错误,当你看见语法错误,缺少分号的时候,你肯定会到编辑器报的错误的地方认真仔细的看一遍(这里假想情况是模板类声明和实现分开写的),没毛病呀,于是又仔细的看一遍,还是找不到错误的地方。好了,这种情况实际上是因为前面写类的时候后面忘了添加分号的原因哦,所以请到.h文件中查看类的后面是不是少写了一个分号吧。

对于这种出现大量函数模板已经定义的情况,很大情况是由于头文件冲突所导致的,如果你是.h和.cpp分开写的话,可以在.h的类后面加上#include xxx.cpp,其中的内容是你写的类名,这种写法呢其实就相当于把声明和实现写在了一个文件里。这里要注意在.cpp文件里面不要包含当前类的.h文件哦,不要包含,不要包含,不要包含!当然你还有可能出现命名冲突的情况,那么你可以在.h文件中头部添加#infdef XXXX_H,#define XXXX_H,这里写你的文件名,然后尾部再写上#endif。如果你遇到了非常糟糕的情况:error LNK:无法解析的外部符号的情况,后面跟着名称粉碎,那还是再看看头文件吧。

好了,说的这些应该是非常基础的一些知识了,好吧,对于大佬来说肯定会有鄙视的眼神的,这些都是常识。唔,好吧,大佬说的都是对的。第一次写博客,写的非常的简陋,今后有时间的话争取把内容再扩充扩充吧。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。