模板类,包括C ++中的保护

时间:2010-03-08 12:28:15

标签: c++ templates include-guards

在模板类中包含保护是明智的吗?

每次使用不同的实现引用模板类时,是不是应该重新分析模板类?

N.B在Visual C ++ 2008中,我没有将两者结合起来的错误...

4 个答案:

答案 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,但是警卫会在第二次和随后的时间启动,以确保编译器只看到一次内容。

编译器重新编译任何东西并不重要;这是它的工作。您只需提供一次内容,然后编译器就会看到它,并且可以根据需要再次引用它。