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.3 テンプレートのインスタンス化

テンプレートのインスタンス化には、特定の組み合わせのテンプレート引数に対応した具体的なクラスまたは関数 (インスタンス) を生成することが含まれます。たとえば、コンパイラは Array<int> クラスと Array<double> に対応した別々のクラスを生成します。これらの新しいクラスの定義では、テンプレートクラスの定義の中のテンプレートパラメータがテンプレート引数に置き換えられます。「6.2 クラステンプレート」に示す Array<int> の例では、Elem が表示されるたびに、コンパイラが int を置き換えます。

6.3.1 テンプレートの暗黙的インタンス化

テンプレート関数またはテンプレートクラスを使用すると、インスタンス化が必要になります。そのインスタンスがまだ存在していない場合には、コンパイラはテンプレート引数に対応したテンプレートを暗黙的にインスタンス化します。

6.3.2 テンプレートの明示的インスタンス化

コンパイラは、実際に使用されるテンプレート引数に対応したテンプレートだけを暗黙的にインスタンス化します。これは、テンプレートを持つライブラリの作成には適していない可能性があります。C++ には、次の例のように、テンプレートを明示的にインスタンス化するための手段が用意されています。

6.3.2.1 テンプレート関数の明示的インスタンス化

テンプレート関数を明示的にインスタンス化するには、template キーワードに続けて関数の宣言 (定義ではない) を行います。関数の宣言では関数識別子のあとにテンプレート引数を指定します。

template float twice<float>(float original);

テンプレート引数は、コンパイラが推測できる場合は省略できます。

template int twice(int original);

6.3.2.2 テンプレートクラスの明示的インスタンス化

テンプレートクラスを明示的にインスタンス化するには、template キーワードに続けてクラスの宣言 (定義ではない) を行います。クラスの宣言ではクラス識別子のあとにテンプレート引数を指定します。

template class Array<char>;
template class String<19>;

クラスを明示的にインスタンス化すると、そのメンバーもすべてインスタンス化されます。

6.3.2.3 テンプレートクラス関数メンバーの明示的インスタンス化

テンプレート関数メンバーを明示的にインスタンス化するには、template キーワードに続けて関数の宣言 (定義ではない) を行います。関数の宣言ではテンプレートクラスで修飾した関数識別子のあとにテンプレート引数を指定します。

template int Array<char>::GetSize();
template int String<19>::length();

6.3.2.4 テンプレートクラスの静的データメンバーの明示的インスタンス化

テンプレートの静的データメンバーを明示的にインスタンス化するには、template キーワードに続けてメンバーの宣言 (定義ではない) を行います。メンバーの宣言では、テンプレートクラスで修飾したメンバー識別子のあとにテンプレート引数を指定します。

template int String<19>::overflows;