1、
重载函数的几点注意事项:
1:重载函数是从参数表来区分的,返回类型不足以区分两个重载函数;
2:const或者volatile修饰函数形参时,如果修饰的是指针或者引用参数所指向的类型则和没有const或者volatile修饰的函数构成重载(
如果两个转换序列的前面都相同,则没有额外限定转化的序列比较匹配);如果修饰的是其他的类型,则不构成重载。例如int func1(int *)和int func1(const int *)构成重载,而int func2(int)int func2(const int)则不构成重载;
3:重载函数的全部候选函数都应该在同一个域中声明,是“在调用点可见的函数(包括using声明和using指示符引入的函数)”以及“在实参类型所在的名字空间中声明的同名函数”的集合;
4:链接指示符只能指定重载函数集中的一个函数(因为在编译器层次上,C不支持重载);
5:在两个函数指针类型之间不能进行类型转换,即如果一个重载函数的地址被赋给一个函数指针,则该函数指针的类型被用来选择赋值符号右边的函数,如果不能找到完全匹配的函数,则复制错误;
6:当一个非模板函数和一个函数模板实例化而来的函数相同时,因为该非模板函数被显示实现,故其具有更高的优先级;
7:只有当模板实参推演成功时,函数模板实例和模板的显示特化才会进入候选函数集。
2、
模板实参推演中只允许三种类型转换:左值转换、限定修饰转化和到一个基类(该基类根据一个类模板实例化而来)的转换。对于最后一种到一个基类的转换,如果函数参数是一个类模板,且如果实参是一个类,它有一个从被指定为函数参数类模板实例化而来的基类,则可以进行实参推演。
3、模板编译模式
1:包含编译模式,类似于内联函数声明和定义的组织方式,把模板的定义放在头文件中;
2:分离编译模式,类似于非内联函数声明和定义的组织方式,函数模板的声明放在头文件中,模板定义放在程序文本文件中,且注意必须在定义前加上关键字export,定义为可导出的模板。
4、
关于函数模板的显示特化声明:
1:一个程序不能对相同的模板实参集中的同一个模板有一个显示特化和模板实例。即在模板的显示特化之前,不能实例化该显示特化对应的模板函数,故显示特化的声明一般放在头文件中;
2:函数模板的显示特化声明必须被声明在该通用模板被定义的名字空间中。