跳过导航链接 | |
退出打印视图 | |
Oracle Solaris Studio 12.3:C++ 用户指南 Oracle Solaris Studio 12.3 Information Library (简体中文) |
可以用两种方法组织模板定义:使用包括的定义和使用独立的定义。包括的定义组织允许对模板编译进行更多的控制。
在将模板的声明和定义放在使用该模板的文件中时,组织是包括定义的组织。例如:
main.cc
template <class Number> Number twice(Number original); template <class Number> Number twice(Number original ) { return original + original; } int main() { return twice<int>(-3); }
使用模板的文件包括了包含模板声明和模板定义的文件时,使用模板的该文件的组织也是包括定义的组织。例如:
twice.h
#ifndef TWICE_H #define TWICE_H template <class Number> Number twice(Number original); template <class Number> Number twice( Number original ) { return original + original; } #endif
main.cc
#include “twice.h” int main() { return twice(-3); }
另一种组织模板定义的方法是将定义保留在模板定义文件中,如以下示例所示。
twice.h
#ifndef TWICE_H #define TWICE_H template <class Number> Number twice(Number original); #endif TWICE_H
twice.cc
template <class Number> Number twice( Number original ) { return original + original; }
main.cc
#include “twice.h” int main( ) { return twice<int>( -3 ); }
模板定义文件不得包括任何非幂等头文件,而且通常根本不需要包括任何头文件。(请参见5.1.2 幂等头文件。)请注意,并非所有编译器都支持模板的独立定义模型。
一个单独的定义文件作为头文件时,该文件可能会被隐式包括在许多文件中。因此,它不应该包含任何函数或变量定义,除非这些定义是模板定义的一部分。一个单独的定义文件可以包含类型定义,包括 typedef。
注 - 尽管通常会使用模板定义文件的源文件扩展名(即 .c、.C、.cc、.cpp、.cxx 或 .c++),但模板定义文件是头文件。如果需要,编译器会自动包括它们。模板定义文件不应单独编译。
如果将模板声明放置在一个文件中,而将模板定义放置在另一个文件中,则需仔细考虑如何构造定义文件,如何命名定义文件和如何放置定义文件。此外也需要向编译器显式指定定义的位置。有关模板定义搜索规则的信息,请参阅7.5 模板定义搜索。
使用 -E 或 -P 选项生成预处理器输出时,定义分离的文件组织不允许在 .i 文件中包含模板定义。编译 .i 文件时会因缺少定义而失败。通过有条件地在模板声明标题中包含模板定义文件(请参见下面的代码示例),可确保通过在命令行中使用 -template=no%extdef 来使用模板定义。libCtd 和 STLport 库以此方式实现。
// templace declaration file template <class T> class foo { ... }; #ifdef _TEMPLATE_NO_EXTDEF #include "foo.cc" //template definition file #endif
但是,请勿尝试自行定义宏 _TEMPLATE_NO_EXTDEF。如果定义时没有使用 —template=no%extdef 选项,可能会因为包含多个模板定义文件而导致编译失败。