JavaScript is required to for searching.
跳过导航链接
退出打印视图
Oracle Solaris Studio 12.3:C++ 用户指南     Oracle Solaris Studio 12.3 Information Library (简体中文)
search filter icon
search icon

文档信息

前言

第 1 部分C++ 编译器

1.  C++ 编译器

2.  使用 C++ 编译器

3.  使用 C++ 编译器选项

第 2 部分编写 C++ 程序

4.  语言扩展

5.  程序组织

6.  创建和使用模板

6.1 函数模板

6.1.1 函数模板声明

6.1.2 函数模板定义

6.1.3 函数模板用法

6.2 类模板

6.2.1 类模板声明

6.2.2 类模板定义

6.2.3 类模板成员定义

6.2.3.1 函数成员定义

6.2.3.2 静态数据成员定义

6.2.4 类模板的用法

6.3 模板实例化

6.3.1 隐式模板实例化

6.3.2 显式模板实例化

6.3.2.1 模板函数的显式实例化

6.3.2.2 模板类的显式实例化

6.3.2.3 模板类函数成员的显式实例化

6.3.2.4 模板类静态数据成员的显式实例

6.4 模板组合

6.5 缺省模板参数

6.6 模板专门化

6.6.1 模板专门化声明

6.6.2 模板专门化定义

6.6.3 模板专门化使用和实例化

6.6.4 部分专门化

6.7 模板问题部分

6.7.1 非本地名称解析和实例化

6.7.2 作为模板参数的本地类型

6.7.3 模板函数的友元声明

6.7.4 在模板定义内使用限定名称

6.7.5 嵌套模板名称

6.7.6 引用静态变量和静态函数

6.7.7 在同一目录中使用模板生成多个程序

7.  编译模板

8.  异常处理

9.  改善程序性能

10.  生成多线程程序

第 3 部分库

11.  使用库

12.  使用 C++ 标准库

13.  使用传统 iostream

14.  生成库

第 4 部分附录

A.  C++ 编译器选项

B.  Pragma

词汇表

索引

6.2 类模板

类模板描述了一组相关的类或数据类型,它们只能通过类型来区分:整数值、指向(或引用)具有全局链接的变量的指针、其他的组合。类模板尤其适用于描述通用但类型安全的数据结构。

6.2.1 类模板声明

类模板声明仅提供了类的名称和类的模板参数。此类声明是不完整的类模板

以下示例是名为 Array 类的模板声明,该类可接受任何类型作为参数。

template <class Elem> class Array;

该模板用于名为 String 的类,该类接受 unsigned int 作为参数。

template <unsigned Size> class String;

6.2.2 类模板定义

类模板定义必须声明类数据和函数成员,如以下示例所示。

template <class Elem> class Array {
        Elem* data;
        int size;
    public:
        Array( int sz );
        int GetSize();
        Elem& operator[]( int idx );
};
template <unsigned Size> class String {
        char data[Size];
        static int overflows;
    public:
        String( char *initial );
        int length();
};

与函数模板不同,类模板可以同时有类型参数(如 class Elem)和表达式参数(如 unsigned Size)。表达式参数可以是:

6.2.3 类模板成员定义

类模板的完整定义需要类模板函数成员和静态数据成员的定义。动态(非静态)数据成员由类模板声明完全定义。

6.2.3.1 函数成员定义

模板函数成员的定义由模板参数专门化后跟函数定义组成。函数标识符通过类模板的类名称和模板参数限定。以下示例说明了 Array 类模板的两个函数成员的定义,该模板中指定了模板参数 template <class Elem>。每个函数标识符都通过模板类名称和模板参数 Array<Elem> 限定。

template <class Elem> Array<Elem>::Array( int sz )
    {size = sz; data = new Elem[size];}

template <class Elem> int Array<Elem>::GetSize()
    { return size; }

该示例说明了 String 类模板的函数成员的定义。

#include <string.h>
template <unsigned Size> int String<Size>::length( )
    {int len = 0;
      while (len < Size && data[len]!= ’\0’) len++;
      return len;}

template <unsigned Size> String<Size>::String(char *initial)
    {strncpy(data, initial, Size);
      if (length( ) == Size) overflows++;}

6.2.3.2 静态数据成员定义

模板静态数据成员的定义由后跟变量定义的模板参数专门化组成,在此处变量标识符通过类模板名称和类模板实元参数来限定。

template <unsigned Size> int String<Size>::overflows = 0;

6.2.4 类模板的用法

模板类可以在使用类型的任何地方使用。指定模板类包括了提供模板名称和参数的值。以下示例中的声明根据 Array 模板创建 int_array 变量。变量的类声明及其一组方法类似于 Array 模板中的声明和方法,只是 Elem 替换为了 int。请参见6.3 模板实例化

Array<int> int_array(100);

此示例中的声明使用 String 模板创建 short_string 变量。

String<8> short_string("hello");

需要任何其他成员函数时,您可以使用模板类成员函数。

int x = int_array.GetSize( );
int x = short_string.length( );
.