我想在一个文件中定义一个模板函数,并在许多文件中使用。这是否与常规函数原型的工作方式相同?所以我可以定义一次,只是将原型包含在其他文件中?我对类有相同的问题,我是否必须在每个头文件中包含模板类的完全定义,就像我对类一样?如果我在单独的文件中定义了两次模板函数,或者只是取消选中它,会导致错误吗?
还有一个问题,模板函数原型的格式是什么?
答案 0 :(得分:4)
不,它与常规功能不同。使用常规功能,您可以声明
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)
或foo(string)
或foo(myWeirdClass)
或任何bar.cc
调用定义,并将其构建为bar.o
(或者如果模板对该类型没有意义则抱怨)。
课程也一样。
模板专业化的规则略有不同,但在尝试高级技术之前,您应该掌握基础知识。
答案 1 :(得分:2)
见FAQ。特别是,items 12, 13 and 14涉及分离模板函数的声明和定义。