c++重载决议具体化优先于函数模板

问题描述

c++重载决议具体化优先于函数模板

template void f(T a){ cout << "aaaaaaa"; }
template <> void f(int & a){ cout << "fffffffffff"; }
int b;f(b);
为什么输出aaaaaaa,不是应该输出fffffffffff吗,看书上说具体化优先于模板函数的

求知道的大神指点下啦,万分感谢

解决方案

 #include <iostream>
using namespace std;
template <typename T>void f(T a){ cout << "aaaaaaa"; }
void f(int & a){ cout << "fffffffffff"; }
int main()
{
 int b;
 f(b);
}

http://codepad.org/iyORv2CE
在线运行的结果
输出的是fffffffffff

解决方案二:

如果你这么写

# include <iostream>
using namespace std;

template <> void f(int &a){ cout << "fffffffffff"; }

int main()
{
    int bb=9;
    f(bb);

    return 0;
}

根本认不到f
说明不是重载选择的问题,而是后面那个函数根本不合法。

解决方案三:

很奇怪,在g++上的结果确实的第一个,即来自函数模版,而非其特例。

ps,如果把特例的参数,从int &修改为int(去掉引用),行为就正常了。

看起来,模版推导的逻辑,对引用有什么特别的规则?

解决方案四:

http://stackoverflow.com/questions/4677592/specializing-function-template-for-reference-types
如果一定要int&版本的命中,不要使用模版,而使用overload机制。

解决方案五:

感觉函数模版的推导逻辑是,先在多个模版之间选择最合适的模版,然后看最合适的模版有没有特化。就这个例子而言,由于只有一个模版,那么根据f(bb)得到T=int,而第二个是针对int&的特化,两者不匹配。

时间: 2024-11-18 04:46:31

c++重载决议具体化优先于函数模板的相关文章

C++中函数模板(function template) 的 重载(overload) 详解

函数模板(function template)重载, 即实例化特定的模板, 确定T的类型, 选择匹配度最高的一个; 需要注意传递的具体类型, 如传递的是"&s", 则表示"string* t = &s", 即实际匹配的类型为"string* t"; 当非函数模板和函数模板匹配度相同时, 优先选择非函数模板; 调用模板时, 一定要注意顺序, 或者提前声明, 以保证可以找到函数模板, 进行实例化; 具体参见代码注释, 代码如下: /*

引用-关于函数模板重载与指针参数

问题描述 关于函数模板重载与指针参数 模板一: template string debug_rep(const T &t); 模板二: template string debug_rep(T *p): 使用: string s("hi"); const string *sp=&s; 方式一:debug_rep(&s): 方式二:debug_rep(sp): 方式一.二都会匹配模板二,但为什么说方式一对模板二是精确匹配,方式二对模板一.二都是精确匹配,由于特例化匹

《C++ Templates中文版》——2.4 重载函数模板

2.4 重载函数模板 和普通函数一样,函数模板也可以被重载.就是说,相同的函数名称可以具有不同的函数定义:于是,当使用函数名称进行函数调用的时候,C++编译器必须决定究竟要调用哪个候选函数.即使在不考虑模板的情况下,做出该决定的规则也已经是相当复杂,但在这一节里,我们将讨论有关模板的重载问题.如果你对不含模板的重载的基本规则还不是很熟悉,那么请先阅读附录B,在那里我们对重载解析规则进行了很详细的叙述. 下面的简短程序叙述了如何重载一个函数模板: //basics/max2.cpp //求两个in

c++ 函数模板重载-关于c++中函数模板的重载问题

问题描述 关于c++中函数模板的重载问题 直接上代码(简单),enter code here template< class T > void test(T x){ cout<<x<<endl; } void test(int); int main(){ int x = 1; test(x); } 上述程序使用非模板函数对函数模板test进行重载:按照书中的说法-这个非模板函数可以只声明原型,然后借用模板中定义的函数体. 但是链接的时候找不到那个非模板函数的定义(使用的

《C和C++代码精粹》——1.11 函数重载和函数模板

1.11 函数重载和函数模板 C和C++代码精粹程序清单1.4中的交换函数(swap)只有在交换整数时才有用.如果要交换两个任何系统预定义的数据类型中的对象该么办呢?C++允许定义多个同名函数,只要它们的特征不同.因此就可以为所有系统预定义的数据类型定义一个交换函数: void swap(char &,char &); void swap(int &,int &); void swap(long &,long &); void swap(float &

函数模板,函数模板重载,可变参数模板,函数模板覆盖,通过引用交换数据

 1.函数模板初级,如果想使用模板,需要实例化,实例化的方式是加上<数据类型> #include <iostream>   //函数模板可以对类型进行优化重载,根据类型会覆盖 //如果仍然要使用模板函数,需要实例化   template<class T> T add(T a, T b) {     std::cout << "T add " << std::endl;     return a + b; }   int a

(一〇六)函数模板

函数模板的意义在于,可以在不同的参数下,起到同样的作用. 按照教程所说,它们使用泛型来定义函数,其中泛型可用具体的类型(如int.double)替换.通过将类型作为参数传递给模板,可使编译器生成该类型的函数.   由于模板允许以泛型(而不是具体的类型)的方式编写程序,因此在有时也会被称为是通用编程.   由于类型是用参数表示的,因此模板特性有时也被称为参数化类型.   格式: template <typename xx> void 函数名(xx &a, xx &b) { xx

C++中函数模板定制(function template specialization) 详解

函数模板定制可以解决特定的模板参数, 需要特定的函数方法去实现; 注意函数模板定制是实例化模板, 而不是模板的重载; 有非模板函数(nontemplate function)存在时, 当匹配度相同时, 优先使用非模板函数; 如比较(compare)函数, 比较字符串(char*)类型, 不能通过判断地址去比较, 应该使用strcmp()函数, 需要定制函数模板; 函数模板定制需要使用 "template<>", 空的尖括号表明 提供的模板实参支持原版本的所有模板形参; 代码

【C/C++学院】(11)泛型编程/函数模板/类模板

1.泛型编程基础 #include "iostream" using namespace std; void swap(int &a, int &b) { int c; c = a; a = b; b = c; } void swap(float &a, float &b) { float c; c = a; a = b; b = c; } void main() { int a = 1, b = 2; swap(a, b); float a1 = 1,