JavaScript is required to for searching.
跳过导航链接
退出打印视图
Oracle Solaris Studio 12.3:C++ 用户指南     Oracle Solaris Studio 12.3 Information Library (简体中文)
search filter icon
search icon

文档信息

前言

第 1 部分C++ 编译器

1.  C++ 编译器

2.  使用 C++ 编译器

3.  使用 C++ 编译器选项

第 2 部分编写 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.  生成多线程程序

第 3 部分库

11.  使用库

12.  使用 C++ 标准库

13.  使用传统 iostream

14.  生成库

第 4 部分附录

A.  C++ 编译器选项

B.  Pragma

词汇表

索引

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 目录之一中,或位于与其匹配的头文件所在目录中。

7.5.2 定义搜索路径

可以用另外一种方法替代用 –I 设置的常规搜索路径,即使用选项 –ptidirectory 指定模板定义文件的搜索目录。多个 -pti 标志定义多个搜索目录,即搜索路径。如果使用 -ptidirectory,则编译器在该路径查找模板定义文件并忽略 –I 标志。由于 -ptidirectory 标志会使源文件的搜索规则变得复杂,因此应使用 -I 选项而不是 -ptidirectory 选项。

7.5.3 诊断有问题的搜索

有时,编译器会生成令人费解的警告或错误消息,因为它会查找您不打算编译的文件。此问题通常是由于已有某个文件(如 foo.h)包含了模板声明,但又隐式包含了另一个文件(如 foo.cc)。

如果头文件 foo.h 有模板声明,缺省情况下,编译器会搜索名为 foo 且具有 C++ 文件扩展名(.C、.c、.cc、.cpp.cxx 或 .c++)的文件。如果找到这样的文件,编译器将自动把它包含进来。有关这些搜索的更多信息,请参见7.5 模板定义搜索

如果有一个不打算这样处理的文件 foo.cc,有两种解决方法: