コンパイラがコンパイル対象ではないファイルを検索するために、紛らわしい警告あるいはエラーメッセージが生成されることがあります。通常、問題は、たとえば foo.h というファイルにテンプレート宣言が含まれていて、foo.cc などの別のファイルが暗黙で取り込まれることにあります。
ヘッダーファイル foo.h の中にテンプレート宣言が存在する場合は、コンパイラはデフォルトで、foo という名前および C++ のファイル拡張子 (.C、.c、.cc、.cpp、.cxx、または .c++) を持つファイルをデフォルトで検索します。そうしたファイルを見つけた場合、コンパイラはそのファイルを自動的に取り込みます。こうした検索の詳細は、「7.5 テンプレート定義の検索」を参照してください。
このように扱われるべきでないファイル foo.cc が存在する場合、選択肢は 2 つあります。
.h または .cc の名前を変更して、名前が一致しないようにする。
-template=no%extdef オプションを指定することによって、テンプレート定義ファイルの自動検索を無効にする。この場合は、すべてのテンプレート定義をコードに明示的に取り込む必要があります。このため、「定義分離」モデルは使用できなくなります。