Sun Studio 12 Update 1: C++ ユーザーズガイド

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 つあります。