我想在一个文件中定义一个模板函数并在多个文件中使用。这是否与常规函数原型的工作方式相同?所以我可以定义一次,然后将原型包含在其他文件中?我对类有同样的问题,我是否必须在每个头文件中包含模板类的完整定义,就像我对类一样?如果我在单独的文件中定义了两次模板函数,或者这只是未经检查,会导致错误吗?
还有一个问题,模板函数原型的格式是什么?
我想在一个文件中定义一个模板函数并在多个文件中使用。这是否与常规函数原型的工作方式相同?所以我可以定义一次,然后将原型包含在其他文件中?我对类有同样的问题,我是否必须在每个头文件中包含模板类的完整定义,就像我对类一样?如果我在单独的文件中定义了两次模板函数,或者这只是未经检查,会导致错误吗?
还有一个问题,模板函数原型的格式是什么?
不,它与常规功能不同。使用常规函数,您可以声明
void foo(int);
void foo(double);
在头文件中,定义某些源文件中的函数,例如foo.cc
,#include 任何必须使用这些函数的源文件中的头文件,例如bar.cc
,并让链接器完成其余的工作。编译器将编译bar.cc
并生成bar.o
,确信您已经在某处定义了函数,如果没有,那么您将收到链接时错误。
但是,如果您使用的是模板:
template <typename T>
void foo(T) ...
试着想象那将如何运作。源文件foo.cc
和bar.cc
是独立的并且彼此一无所知,除了他们同意他们都#include的标题中的内容(这就是整个想法)。所以bar.cc
不知道如何foo.cc
实现事物,foo.cc
也不知道bar.cc
这些功能将做什么。在这种情况下,foo.cc
不知道将为 T 指定什么类型bar.cc
。foo.cc
那么,在阳光下怎么可能对每个类型名都有定义呢?
它不能,所以这种方法是不允许的。您必须在头文件中包含整个模板,以便编译器可以为foo(int)
、 or foo(string)
、 orfoo(myWeirdClass)
或任何bar.cc
需要的内容创建定义,并将其构建到bar.o
(或者如果模板对该类型没有意义则抱怨)。
课程也是如此。
模板专业化的规则略有不同,但在尝试高级技术之前,您应该掌握基础知识。
请参阅此常见问题解答。特别是,第 12、13 和 14 项处理分离模板函数的声明和定义。