JavaScript is required to for searching.
ナビゲーションリンクをスキップ
印刷ビューの終了
Oracle Solaris Studio 12.3: C++ ユーザーズガイド     Oracle Solaris Studio 12.3 Information Library (日本語)
search filter icon
search icon

ドキュメントの情報

はじめに

パート I C++ コンパイラ

1.  C++ コンパイラの紹介

2.  C++ コンパイラの使用方法

3.  C++ コンパイラオプションの使い方

パート II 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.  マルチスレッドプログラムの構築

パート III ライブラリ

11.  ライブラリの使用

12.  C++ 標準ライブラリの使用

13.  従来の iostream ライブラリの使用

14.  ライブラリの構築

パート IV 付録

A.  C++ コンパイラオプション

B.  プラグマ

用語集

索引

6.2 クラステンプレート

クラステンプレートは、複数の関連するクラスまたはデータ型を記述します。クラステンプレートに記述されているクラスは、型、整数値、大域リンケージによる変数へのポインタや参照だけが互いに異なっています。クラステンプレートは、一般的ではあるが型が保証されているデータ構造を記述するのに特に便利です。

6.2.1 クラステンプレートの宣言

クラステンプレートの宣言では、クラスの名前とそのテンプレート引数だけを指定します。このような宣言は「不完全なクラステンプレート」と呼ばれます。

次の例は、任意の型の引数をとる Array というクラスに対するテンプレート宣言の例です。

template <class Elem> class Array;

次のテンプレートは、unsigned int の引数をとる String というクラスに対する宣言です。

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 関数メンバーの定義

テンプレート関数メンバーの定義は、テンプレートパラメータの指定と、それに続く関数定義から構成されます。関数識別子は、クラステンプレートのクラス名とそのテンプレートの引数で修飾されます。次の例は、template <class Elem> というテンプレートパラメータ指定を持つ Array クラステンプレートの 2 つの関数メンバー定義を示しています。それぞれの関数識別子は、テンプレートクラス名とテンプレート引数 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 を作成します。この変数のクラス宣言とその一連のメソッドは、Elemint に置き換わっている点以外は、Array テンプレートとまったく同じです。「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( );
.