0

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

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

4

2 回答 2

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.ccfoo.cc那么,在阳光下怎么可能对每个类型名都有定义呢?

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

课程也是如此。

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

于 2011-04-25T05:10:53.713 回答
2

请参阅此常见问题解答。特别是,第 12、13 和 14 项处理分离模板函数的声明和定义。

于 2011-04-25T05:06:45.350 回答