C++模板编程


645 浏览 5 years, 4 months

2.3 将模板代码分布在多个文件中

版权声明: 转载请注明出处 http://www.codingsoho.com/

将模板代码分布在多个文件中

通常情况下,您会将类定义放在一个头文件中,然后将方法定义放在一个源代码文件中。创建或使用类对象的代码会通过#include来包含对应的头文件,并且通过链接器的作用访问这些方法代码。

模板不按这种方式工作。由于编译器需要通过这些“模板”为实例化类型生成实际的方法代码,因此在任何使用了模板的源代码文件中,编译器都应该能同时访问到模板类定义和方法定义。有好几种机制可以满足这种包含需求。

1.将模板定义放在头文件中

方法定义可与类定义直接放在同一个头文件中。当使用了这个模板的源文件通过#include包含了这个文件的时候,编译器能访问到需要的所有代码。

此外,还可将模板方法定义放在另一个头文件中,然后在类定义的头文件中通过#include包含这个头文件。一定要保证方法定义的#include在类定义之后,否则代码无法成功编译。

template <typename T>
class Grid
{

};

#include "GridDefinitions.h"

任何需要使用Grid模板的客户只需要包含Grid.h头文件即可。这种分发有助于分开类定义和方法定义。

2.将模板定义放在源文件中

将方法实现放在头文件中看上去很奇怪。如果不喜欢这种语法,还有一种方法可以将方法定义放在一个源代码文件中。然而,仍然需要让使用模板的代码能访问到定义,因此可在模板类定义头文件中通过#include包含类方法实现的源文件。

尽管如果您之前没有看过这种方式会感到有点奇怪,但是这在C++中是合法的。头文件如下所示:

template <typename T>
class Grid
{
};

#include "Grid.cpp"

使用这种技术的时候,一定不要把Grid.cpp文件添加到项目中,因为这个文件本不应该在项目中,而且无法单独编译;这个文件只能通过#include被包含在一个头文件中。
实际上,您可以任意命名包含方法实现的文件。有些程序员喜欢给包含的源代码文件添加一个.inl后缀,例如Grid.inl。

C++11之前的标准的确定义了一种将模板方法定义放在源代码文件中的方法,不需要在头文件中添加#include语句。必须通过export关键字指定那些模板定义应该能用于所有编译单元(源文件)。然而,在C++11中再也不允许这样做了。