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.  テンプレートの作成と使用

7.  テンプレートのコンパイル

7.1 冗長コンパイル

7.2 リポジトリの管理

7.2.1 生成されるインスタンス

7.2.2 全クラスインスタンス化

7.2.3 コンパイル時のインスタンス化

7.2.4 テンプレートインスタンスの配置とリンケージ

7.3 外部インスタンス

7.3.1 キャッシュの衝突の可能性

7.3.2 静的インスタンス

7.3.3 大域インスタンス

7.3.4 明示的インスタンス

7.3.5 半明示的インスタンス

7.4 テンプレートリポジトリ

7.4.1 リポジトリの構造

7.4.2 テンプレートリポジトリへの書き込み

7.4.3 複数のテンプレートリポジトリからの読み取り

7.4.4 テンプレートリポジトリの共有

7.4.5 -instances=extern による テンプレートインスタンスの自動一貫性

7.5 テンプレート定義の検索

7.5.1 ソースファイルの位置規約

7.5.2 定義検索パス

7.5.3 問題がある検索の回避

8.  例外処理

9.  プログラムパフォーマンスの改善

10.  マルチスレッドプログラムの構築

パート III ライブラリ

11.  ライブラリの使用

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

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

14.  ライブラリの構築

パート IV 付録

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

B.  プラグマ

用語集

索引

7.5 テンプレート定義の検索

定義分離型テンプレートの編成、つまりテンプレートを使用するファイルの中にテンプレートの宣言だけがあって定義はないという編成を使用している場合には、現在のコンパイル単位にテンプレート定義が存在しないので、コンパイラが定義を検索しなければなりません。この節では、そうした検索について説明します。

定義の検索はかなり複雑で、エラーを発生しやすい傾向があります。このため、可能であれば、定義取り込み型のテンプレートファイルの編成を使用したほうがよいでしょう。こうすれば、定義検索をまったく行わなくて済みます。「5.2.1 テンプレート定義の取り込み」を参照してください。


注 - -template=no%extdef オプションを使用する場合、コンパイラは分離されたソースファイルを検索しません


7.5.1 ソースファイルの位置規約

オプションファイルで提供されるような特定の指令がない場合には、コンパイラは Cfront 形式の方法でテンプレート定義ファイルを検出します。この方法の場合、テンプレート宣言ファイルと同じベース名がテンプレート定義ファイルに含まれている必要があります。またこの方法では、テンプレート定義ファイルが現在の include パス上にある必要もあります。たとえば、テンプレート関数 foo()foo.h 内にある場合には、それと一致するテンプレート定義ファイルの名前を foo.cc か、またはほかの認識可能なソースファイル拡張子 (.C.c.cc.cpp.cxx、または .c++) にしなければなりません。テンプレート定義ファイルは、通常使用する include ディレクトリの 1 つか、またはそれと一致するヘッダーファイルと同じディレクトリの中に置かなければなりません。

7.5.2 定義検索パス

-I で設定する通常の検索パスの代わりに、-ptidirectory オプションでテンプレート定義ファイルの検索ディレクトリを指定することができます。複数の -pti フラグは、複数の検索ディレクトリ、つまり 1 つの検索パスを定義します。-ptidirectory を使用している場合には、コンパイラはこのパス上のテンプレート定義ファイルを探し、-I フラグを無視します。-ptidirectory フラグはソースファイルの検索規則を複雑にするので、-ptidirectory オプションの代わりに -I オプションを使用してください。

7.5.3 問題がある検索の回避

コンパイラが、コンパイル対象ではないファイルを検索することが原因で、紛らわしい警告またはエラーメッセージが生成されることがあります。通常、問題は、たとえば foo.h というファイルにテンプレート宣言が含まれていて、foo.cc などの別のファイルが暗黙的に取り込まれることにあります。

ヘッダーファイル foo.h の中にテンプレート宣言が存在する場合は、コンパイラはデフォルトで、foo という名前および C++ のファイル拡張子 (.C、.c、.cc、.cpp.cxx、または .c++) を持つファイルをデフォルトで検索します。そうしたファイルを見つけた場合、コンパイラはそのファイルを自動的に取り込みます。こうした検索の詳細は、「7.5 テンプレート定義の検索」を参照してください。

このように扱われるべきでないファイル foo.cc が存在する場合、選択肢は 2 つあります。