C++中模板定义与声明为什么必须放在同一个文件中

您所在的位置:网站首页 大炮为什么要放气呢 C++中模板定义与声明为什么必须放在同一个文件中

C++中模板定义与声明为什么必须放在同一个文件中

2024-07-05 06:11| 来源: 网络整理| 查看: 265

目录

1.编译链接的过程

2.函数模板

3.总结

1.编译链接的过程

        我们编程的时候习惯将函数的声明文件写在.h文件中,然后将函数的定义写在.cpp文件中,在需要调用别的文件中的某个函数的时候就会将该函数所在的头文件include到调用处的文件头部。在C++程序预编译过程中,所有头文件都会展开,在之后的过程中所有的头文件都会消失,只剩下头部被展开了#include的源文件被转为.obj文件。因为展开了头文件的缘故,这些.cpp文件中会有许多的函数声明。而这些函数声明的真正定义往往就集中在某一个.cpp源文件中(在没有编译错误的前提下,这时候的源文件已经被编译为.obj文件)。然后由链接器负责将各个.obj文件链接起来,让每个函数调用都准确找到对应定义的地址,生成最终的.exe文件。

       头文件声明的作用,就是让编译器知道,这个函数的定义应该在其他文件中,就不会因为暂时找不到函数的定义而报错。至于找到对应的定义,就是链接器需要干的事情。

2.函数模板

        但是函数模板是个例外。我们不能将函数模板和类模板的声明和定义分散在.h文件和.cpp文件中。如果我们这样写了会发生什么呢?看这个例子:

//func.h文件 #pragma once //函数模板的声明 template void Swap(T& a, T& b); //func.cpp文件 #include "func.h" //函数模板的定义 template void Swap(T& a, T& b) { T temp = a; a = b; b = temp; } //main.cpp文件 #include #include "func.h" using namespace std; int main() { int n1 = 10, n2 = 20; Swap(n1, n2); return 0; }

运行会报一个链接错误,提示找不到void Swap(int &, int &)这个函数的具体定义:

究其原因,是因为函数模板实际上并不是一个真正的函数。它仅仅是编译器用来生成函数或类的一张“图纸”。模板不会占用内存,最终生成的函数才会占用内存。函数模板只是用来告诉编译器,在遇到某个函数调用的时候需要生成什么样子的函数。在编译过程中,编译器会参考函数模板,然后生成对应的真正的函数。 例如:

#include #include #include "func.h" using namespace std; template void fun(T a) { cout


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3