模板函数和类在不同文件中使用

时间:2011-04-25 04:41:35

标签: c++ templates template-function

我想在一个文件中定义一个模板函数,并在许多文件中使用。这是否与常规函数原型的工作方式相同?所以我可以定义一次,只是将原型包含在其他文件中?我对类有相同的问题,我是否必须在每个头文件中包含模板类的完全定义,就像我对类一样?如果我在单独的文件中定义了两次模板函数,或者只是取消选中它,会导致错误吗?

还有一个问题,模板函数原型的格式是什么?

2 个答案:

答案 0 :(得分:4)

不,它与常规功能不同。使用常规功能,您可以声明

void foo(int);
void foo(double);

在头文件中,定义某些源文件中的函数,例如foo.cc,#include必须使用这些函数的任何源文件中的头文件,例如bar.cc,并让链接器做其余的事。编译器将编译bar.cc并生成bar.o,确信您已在某处定义了函数,如果还没有,那么您将收到链接时错误。

但如果您使用的是模板:

template <typename T>
void foo(T) ...

试着想象一下这是怎么回事。源文件foo.ccbar.cc是独立的,彼此之间一无所知,除了他们同意头文件中的内容#include(这就是整个想法)。因此bar.cc不知道foo.cc如何实现内容,foo.cc不知道bar.cc将对这些函数做什么。在这种情况下,foo.cc不知道将为T 指定的bar.cc类型。那么foo.cc如何在太阳下为每个类型名定义?

它不能,所以这种方法是不允许的。您必须在标头中包含整个模板,以便编译器可以为foo(int)foo(string)foo(myWeirdClass)或任何bar.cc调用定义,并将其构建为bar.o(或者如果模板对该类型没有意义则抱怨)。

课程也一样。

模板专业化的规则略有不同,但在尝试高级技术之前,您应该掌握基础知识。

答案 1 :(得分:2)

FAQ。特别是,items 12, 13 and 14涉及分离模板函数的声明和定义。