类的成员模板的类内和类外定义方法
2010-12-14 19:04
155 查看
我的文章所写内容,都是自己实际编程中遇到的,通常是在遇到这个问题时,在网上搜索或者自己找到解决办法。
有时候,某些问题要花好久才找的到解决方案,因为网上资料较少,也有可能是我搜索能力不强。
写下这些,一是希望能帮助到遇到同样问题的朋友,二是记下之后,再次遇到这些问题,能记得解决办法。
由于平时工作都很忙,所以我的文章大多都只简单的写了方法,没讲解得太详细。
还是希望能够帮助到有需要的朋友们。
关于类的成员模板不了解的朋友们可以参考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>(); //非类模板的成员模板函数使用方法
}
本文仅简单讲解了类模板和非类模板中的成员模板函数和成员模板类的类内和类外定义方法,希望对有需要的朋友有所帮助。
有时候,某些问题要花好久才找的到解决方案,因为网上资料较少,也有可能是我搜索能力不强。
写下这些,一是希望能帮助到遇到同样问题的朋友,二是记下之后,再次遇到这些问题,能记得解决办法。
由于平时工作都很忙,所以我的文章大多都只简单的写了方法,没讲解得太详细。
还是希望能够帮助到有需要的朋友们。
关于类的成员模板不了解的朋友们可以参考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>(); //非类模板的成员模板函数使用方法
}
本文仅简单讲解了类模板和非类模板中的成员模板函数和成员模板类的类内和类外定义方法,希望对有需要的朋友有所帮助。
相关文章推荐
- 类的成员模板的类内和类外定义方法
- 类模板的定义和使用方法
- C++模板应用——让模板定义和实现分离的方法
- 设计技巧15:模板方法 Template Method 在一个方法中定义一个算法的骨架,而将一些步骤延迟的子类中,实现Ioc
- 第一题 定义分数(Fraction)类: 1、成员变量:分子、分母 2、方法: (1)自定义初始化方法(初始分子和分母) (2)分子的赋值、取值方法 (3)分母的赋值取值方法 (4)打印分数信息
- C++模板 静态成员 定义(实例化)
- erb模板预定义方法
- 定义一个抽象类Shape,成员有图形名称(name)和求面积的抽象方法Area()
- C#--第九周实验--任务2--定义一个静态成员方法,该方法实现字符串反转。
- javascript面向对象之定义成员方法实例分析
- C++模板应用——让模板定义和实现分离的方法
- php类成员变量的两种定义方法
- 结构体定义无名称成员的方法
- Python第十三天 django 1.6 导入模板 定义数据模型 访问数据库 GET和POST方法 SimpleCMDB项目 urllib模块 urllib2模块 httplib模块 django和web服务器整合 wsgi模块 gunicorn模块
- 定义一个静态成员方法,该方法用于提取文件名
- Vue.js 中,7种定义组件模板的方法
- (原创)c#学习笔记10--定义类成员01--成员定义02--建立方法
- 类模板、函数模板以及类成员函数在类外定义情况
- c# 类成员的定义 定义方法、字段和属性