有时,编译器会生成令人费解的警告或错误消息,因为它会查找您不打算编译的文件。此问题通常是由于某个文件(如 foo.h)包含模板声明,且隐式包含了另一个文件(如 foo.cc)。
如果头文件 foo.h 有模板声明,则在缺省情况下,编译器将搜索名为 foo 且有 C++ 文件扩展名( .C、.c、.cc、.cpp、.cxx 或 .c++)的文件。如果找到这样的文件,编译器将自动把它包含进来。有关这些搜索的更多信息,请参见7.5 模板定义搜索。
如果有一个不打算这样处理的文件 foo.cc,有两种解决方法:
更改 .h 或 .cc 文件的名称,以消除名称匹配。
通过指定 -template=no%extdef 选项禁止自动搜索模板定义文件。然后必须在代码中显式包含所有模板定义,并且不能使用“独立定义”模型。