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

Template functions and class use in different files

本文关键字:文件 函数      更新时间:2023-10-16

我想在一个文件中定义一个模板函数,并在许多文件中使用。这与常规函数原型的工作方式相同吗?所以我可以只定义一次然后把原型包含在其他文件中?我对类有同样的问题,我必须在每个头文件中包括模板类的完整定义,就像我对类一样?如果我在不同的文件中定义了一个模板函数两次,会不会导致错误呢?还是不检查呢?

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

不,它与常规函数不同。使用常规函数,您可以声明

void foo(int);
void foo(double);
在头文件

中定义函数,在某些源文件中定义函数,例如foo.cc, #在任何必须使用这些函数的源文件中包含头文件,例如bar.cc,并让链接器完成其余的工作。编译器将编译bar.cc并生成bar.o,确信您已经在某处定义了函数,如果您没有定义,那么您将得到一个链接时间错误。

但是如果你使用的是模板:

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

试着想象一下它是如何工作的。源文件foo.ccbar.cc是独立的,彼此一无所知,除了它们对它们都#包含的头文件中的内容达成一致(这就是整个想法)。所以bar.cc不知道foo.cc是怎么实现的,foo.cc也不知道bar.cc会用这些函数做什么。在这个场景中,foo.cc不知道bar.cc将为T指定什么类型。那么foo.cc怎么可能对所有类型名都有定义呢?

它不能,所以这种方法是不允许的。你必须在头文件中有整个模板,这样编译器才能为foo(int)foo(string)foo(myWeirdClass)bar.cc调用的任何东西创建一个定义,并将其构建到bar.o中(或者如果模板对该类型没有意义就会抱怨)。

类也是如此。

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

参见本FAQ。特别是,第12、13和14项涉及分离模板函数的声明和定义。