c++提供了函数模板,所谓的函数模板实际上就是建立一个通用函数,其函数的类型和形参的类型不具体指定,用一个虚拟的类型来进行代表,这个通用的函数就称为函数模板,凡是函数体相同都可以用这个模板代替,不需要定义多个函数,只是需要在模板中定义一次即可,在调用函数的时候系统会根据实参的类型来取代模板中的虚拟类型,从而实现不同函数的功能
在编译过程中可能遇到的错误:LNK2019无法解析的外部符号 _WinMain@16,该符号在函数 “int __cdecl invoke_main(void)” (?invoke_main@@YAHXZ) 中被引用 解决方法:在资源解决管理器中找到该项目>>属性>>链接器>>系统>>子系统>>窗口(/SUBSYSTEM:WINDOWS)改为控制台(SUBSYSTEM:CONSOLE)
函数模板可以像普通函数那样可以被重载 c++编译器会优先考虑普通函数 如果函数模板可以产生一个更好的匹配,那么选择模板 可以通过空模板实参列表的语法限定编译器只能通过模板匹配
区别:函数模板不允许自动类型转换,模板是严格的类型匹配 普通函数可以自动进行类型转换
#define _CRT_SECURE_NO_WARNINGS #include<iostream> using namespace std; template<class T> //函数模板必须是严格的类型匹配 int myadd(T a,T b) { return a + b; } //普通函数可以进行自动类型的转换 int myadd(int a, char c) { return a + c; } void test01() { int a = 10; int b = 20; char c1 = 'a'; char c2 = 'b'; myadd(a, b);//如果要调用模板函数则需要加上<>即为myadd<>(a,b); //当调用函数时传入的数据同时符合普通函数和模板函数,首先会先和普通函数匹配,如果匹配不成功在去模板函数中匹配 #if 0 myadd(a, c1); myadd(a, b); myadd(c1, b); #endif } template<class T> void print(T a) { } template<class T> void print(T a,T b) { } int main(void) { test01(); system("pause"); return 0; } c++编译器模板机制 编译器编译的原理 在linux中写一个cpp文件:按下ESC退出,按下:wq保存退出进入命令行模式, 接下来要编译.cpp文件,在命令行中敲下g++ -E index.cpp -o index.i 就将cpp文件生成.i文件 可以查看index.i的内容 按下g++ -S index.i -o index.s,编译成汇编文件
按下g++ -C index.s -o index.o 生成.o文件 按下g++ index.s -o index 生成可执行文件 通过file index 查看生成的是否是可执行文件,并且通过./index 执行得出最终的结果1024。