C++模板详解(三):参数化声明详解
2020-02-11 16:01:37来源:博客园 阅读 ()
C++模板详解(三):参数化声明详解
在前两节中(C++模板详解(一)、C++模板详解(二)),我们了解了函数模板和类模板的基本概念和使用方法。在这篇博文里,我们主要来详细地阐述一下"模板的参数声明"这个话题,并且也谈及了函数模板和类模板相结合的使用方式和一些注意事项。
一、函数模板作为普通类和模板类的成员函数
函数模板可以作为普通类和模板类的成员函数。下面的这份代码片段演示了这一点:
template<typename T1>
class List
{
public:
// 位于模板类中的成员函数模板定义:
template<typename T2>
List(const List<T2>& other);
// 错误的写法:不可以是虚函数。
template<typename T1>
virtual void func(T1&& t)
{
}
};
// #1: 在类的外部定义上面的构造函数。
template<typename T1>
template<typename T2>
List<T1>::List(const List<T2>& other)
{
//...
}
class Collection
{
// 位于普通类内部的成员函数模板定义:
template<typename T>
T* alloc()
{
//...
}
// 错误的写法:不可以是虚函数。
template<typename T>
virtual void func(T&& t)
{
}
};
这份代码展示出了很多的概念。
无论是普通类还是模板类,其中的成员函数或是模板成员函数都可以内联地定义在类中,或是定义在类的外部。在外部定义的成员函数模板可以具有多个模板参数子句:一个子句作用于该模板自身,其它子句作用于外围的类模板,其顺序是从最外围的类模板开始,依次到达内部模板。
成员函数模板不可以是虚函数。这是因为,实现虚函数需要使用一个固定大小的虚函数表,每个虚函数都对应虚函数表的一个入口。然而,成员函数模板的实例化个数,要等到整个程序都编译完成时才能确定,这就和"虚函数表的大小是固定的"发生了冲突。所以,成员函数模板不可以是虚函数。
二、模板类可以被嵌套定义在普通类或者模板类中
模板类的定义也是可以嵌套的。例如下面这份示例代码:
// 示例1:模板类可以被嵌套定义在模板类中。
template<typename T1>
class List
{
// 定义并实现。
template<typename T2>
class Node1
{
};
// 定义。
template<typename T2>
class Node2;
};
// 外部实现。
template<typename T1>
template<typename T2>
class List<T1>::Node2
{
};
// 示例2:模板类可以被嵌套定义在普通类中
class Shell
{
// 定义并实现。
template<typename T>
class Inner1
{
};
// 定义。
template<typename T>
class Inner2;
};
// 外部实现。
template<typename T>
class Shell::Inner2
{
};
类似于成员函数的类外实现,内部类的具体实现也同样可以被放到类外进行,它们的书写规则和模板成员函数几乎相同。
三、函数模板声明中的默认参数
函数模板同样可以在声明中提供缺省参数:
template<typename T>
void report(const Stack<T>& stack, int number = 10);
template<typename T>
void fill(const Array<T>& arr, const T& value = T());
由于和普通函数的缺省参数功能相似,具体的注意事项可以直接参看:C++函数详解。
原文链接:https://www.cnblogs.com/rosefinch/p/12295530.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- C++ 转换函数搭配友元函数 2020-06-10
- C++ 自动转换和强制类型转换(用户自定义类类型) 2020-06-10
- C++ rand函数 2020-06-10
- C++ 友元函数 2020-06-10
- C++ 运算符重载 2020-06-10
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash