包括模板类型的头文件

时间:2012-02-10 08:55:12

标签: c++ templates header include

我正在写一个模板类,比如说

template <class T>
class bla {
    bla() ;
    ~bla() ;
};

template <class T>
bla<t>::bla(){}

template <class T>
b<t>::~b(){}

只要T为intchar等等,这样就可以正常工作......但是如果它是自定义类MyClass,它将重新引用头文件MyClass.h被包括在内,还是我错了?

问题:如何以模板方式完成,例如

#include "T.h"

干杯!

2 个答案:

答案 0 :(得分:4)

当您使用bla<MyClass>时,您需要包含bla的定义和MyClass的定义。定义MyClass时,不必知道bla。关于此的神奇之处称为“两阶段名称查找”:在编译模板定义时,将查找不依赖于模板参数的所有名称。在第二阶段,当实例化模板时,在实例化的上下文中查找所有剩余的名称。

答案 1 :(得分:1)

嗯,反之亦然。如果您要在其中一个模块(C ++中的翻译单元)中使用类MyClass,那么您将包含模板容器(上面放置的源代码,我们将其命名为container.h ),然后创建数据结构。

// main.cpp

#include "container.h"
#include "myclass.h"

int main()
{
    bla<MyClass> foo;

    // lots of more things...
}

也许问题是你不知道如何在模块中划分你的代码。一个简单的经验法则是将每个类放在一个模块中,每个模块都有一个.h文件(接口,其中所有声明都在其中),以及.cpp文件(实现文件,大致你写的内部方法)。

希望这有帮助。