在模板类中包含保护是明智的吗?
每次使用不同的实现引用模板类时,是不是应该重新分析模板类?
N.B在Visual C ++ 2008中,我没有将两者结合起来的错误...
答案 0 :(得分:12)
你需要包括警卫。请考虑以下代码:
// this is t.h
template <typename T>
void f( T t ) {
}
// this is t.cpp
#include "t.h"
#include "t.h"
int main() {
f( 1 );
}
这给出了错误:
t.h:2: error: redefinition of 'template<class T> void f(T)'
t.h:2: error: 'template<class T> void f(T)' previously declared here
此外,包含模板的标头通常也包含非模板代码。
答案 1 :(得分:8)
模板定义应该被解析一次(这里有两个阶段名称查找之类的东西,这样可以在没有实例化的情况下立即给出尽可能多的错误)。实例化是使用当时构建的内部数据结构完成的。
模板定义通常(即如果你没有使用export
或做一些特别的事情)在头文件中应该有它们的包含保护。添加一个用于模板定义是没用的,但没有害处。
答案 2 :(得分:2)
简短回答:您计划在任何定义中包含多次的每个单位都应该有一个标题保护。无论是否有模板。
答案 3 :(得分:2)
回答你的第一个问题:是的,在模板类中包含防护是明智的,也是强制性的。或者更严格地围绕每个头文件的整个内容。
当你在头文件中有东西时,这是遵循一个定义规则的方法,这样它就可以共享并且仍然安全。可能有其他头文件包含您的。当编译器编译模块文件时,它可能会多次看到头文件的#include
,但是警卫会在第二次和随后的时间启动,以确保编译器只看到一次内容。
编译器重新编译任何东西并不重要;这是它的工作。您只需提供一次内容,然后编译器就会看到它,并且可以根据需要再次引用它。