波音网站开发,网站flash背景,discuz应用中心退款,wordpress文章显示作者类模板是用来生成类的蓝图#xff0c;与函数模板的不同之处是#xff0c;编译器不能为类模板推断模板参数类型。
所以我们在使用类的时候要带上并且指定类型如下
vectorint v; // 需要带上int 哦定义类模板
如下#xff0c;和函数模板差不多都是…类模板是用来生成类的蓝图与函数模板的不同之处是编译器不能为类模板推断模板参数类型。
所以我们在使用类的时候要带上并且指定类型如下
vectorint v; // 需要带上int 哦定义类模板
如下和函数模板差不多都是在前面放个template里面用typename或者class定义个东东
template typename T
class Demo{
public:void cmp(T a);
private:...
};在类外如果要实现类内函数的实现的话需要有如下写法
templatetypename T // 要加上这个 并且Demo写成这样DemoT
void DemoT::cmp(T a) {cout a endl;
}在类内不需要额外加东西
实例化类模板
Demoint d;
Demochar c;就这样简单用
不过需要注意的是 一个类模板的每个实例都形成一个独立的类类型Demoint 与Demochar 一点关系都没有也不能对其他类型的内部变量访问有啥特殊权限 说白一点就是都是人不过是陌生人而已不是亲戚
一般时候类模板成员都是在使用的时候才实例化的
类模板和友元 当一个类包含一个友元声明时类与友元各自是否是模板是相互无关的。如果一个类模板包含一个非模板的友元则友元可以访问所有模板类型。如果友元自身是模板类可以授权给所有友元模板也可以只授权个特定实例 一对一友好关系
template typename T class Tmp;//声明一个Tmp类模板template typename T
class Demo{
public:void cmp(T a);friend TmpT;
private:
};上述关系中 Tmp 是Demo 的友元不是别的类型的友元
通用和特定的模板友好关系
template typename T class Demo;template typename T class Tmp
{
public:templatetypename Pvoid output(DemoP d) {cout d.p endl;}
};template typename T
class Demo{
public:template typename T friend class Tmp;
private:int p 10;
};int main()
{Demoint d;Tmpchar t;t.output(d);//可以输出是10return 0;
}令模板自己的类型成为自己的友元
templatetypename Type
class bar{friend Type;
}c11还能这样写Type是barType的友元
值得注意的是友元通常是一个函数或者是一个类但是基本类型也是被允许的方便能用基本类型初始化类
模板类型别名
类似下面这样写法 typedef Demoint DemoInt;using DemoChar Demochar;模板中的静态成员
和正常类一样模板中也可以声明静态成员不过需要注意的一点是
模板的静态成员只属于对应的模板
Demoint d ,c ;
Demochar p;d和c拥有同一个静态成员
p自己单独一个静态成员
并且一个static成员函数只有在使用时才会实例化
使用类的类型成员
我们使用 域运算符(::)来访问static成员和类型成员在普通非模板的代码中编译器掌握类的定义因此他知道通过作用域运算符访问的名字是类型还是static成员。
例如下面编译器知道string类型从而知道size_type是一个类型
string::size_type 但是如果在模板下
T::size_type * p;编译器size_type是个啥 ? 昂~懂了是个变量要和 p 乘起来~
编译器默情况就会把他当成变量如果你想让编译器认为他是个类型就要加入typename typename T::size_type *p ;编译器昂~ 闹了半天是个类型啊
虽然可以使用上述但是如果在传入类型时没有size_type类型会报错的哦
默认模板参数
这个和函数参数列表差不多可以指定默认的模板参数
template typename T , typename D int
class Demo{};
Demoint //默认就是Demoint,int
Demoint,char //就是这个类型了有同学就说了一个能行那我都闹上能不能行
template typename T double , typename D int
class Demo{};当然可以
Demo d;//有的脑洞大开同学就像这么写了
Demo p;//这样才是对的