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;   //这里在上面已经添加了iostream
	cout<<"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 LNK2019:无法解析的外部符号的情况,后面跟着名称粉碎,那还是再看看头文件吧。

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

  • 9
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值