我的文章所写内容,都是自己实际编程中遇到的,通常是在遇到这个问题时,在网上搜索或者自己找到解决办法。
有时候,某些问题要花好久才找的到解决方案,因为网上资料较少,也有可能是我搜索能力不强。
写下这些,一是希望能帮助到遇到同样问题的朋友,二是记下之后,再次遇到这些问题,能记得解决办法。
由于平时工作都很忙,所以我的文章大多都只简单的写了方法,没讲解得太详细。
还是希望能够帮助到有需要的朋友们。
关于类的成员模板不了解的朋友们可以参考C++ primer ed3 16.7。
成员模板包括模板函数和模板类,且成员模板可以在类模板和非类模板(普通类)中。
这里将分别讲解类模板和非类模板中两种成员模板的定义方法:类内定义和类外定义。
最简单的定义方法即在类定义里面定义。
方法如下:
1)类模板中成员模板的类体内定义方法:
template<typename T1>
class QQQ
{
public:
template<typename T>//成员模板函数定义
static T f()
{
T t = T();
return t;
}
template<typename T2>//成员模板类定义
class AAA
{
};
};
2)非类模板中成员模板类内定义:
class EEE
{
public:
template<typename T>//成员模板函数定义
static T f()
{
T t = T();
return t;
}
template<typename T2>//成员模板类定义
class AAA
{
};
};
第二种方法是在类外定义:
1)类模板中成员模板的类外定义方法:
template<typename T1>
class QQQ
{
public:
template<typename T>//成员模板函数声明
static T f();
template<typename T2>//成员模板类声明
class AAA;
};
//成员模板函数的类外定义。
template<typename T1>
template<typename T>
T QQQ<T1>::f()
{
T t = T();
return t;
}
//成员模板类的类外定义。
template<typename T1>
template<typename T2>
class QQQ<T1>::AAA
{
};
2)非类模板中成员模板的类外定义方法:
class EEE
{
public:
template<typename T>//成员模板函数声明
static T f();
template<typename T2>//成员模板类声明
class AAA;
};
//成员模板函数类外定义
template<typename T>
T EEE::f()
{
T t = T();
return t;
}
//成员模板类的类外定义
template<typename T2>
class EEE::AAA
{
};
最后,给出类的成员模板的使用方法。
int main()
{
QQQ<int>::AAA<int> qa;//类模板的成员模板类的使用
QQQ<int> q;
cout<<q.f<int>(); //类模板的成员模板函数使用方法,这里显示给出了f的模板实参,因为f没有形参,不能通过隐式推导出模板参数。
EEE::AAA<int> ea; //非类模板的成员模板类使用方法
EEE e;
cout<<e.f<int>(); //非类模板的成员模板函数使用方法
}
本文仅简单讲解了类模板和非类模板中的成员模板函数和成员模板类的类内和类外定义方法,希望对有需要的朋友有所帮助。