2 ruisai19830523 ruisai19830523 于 2016.02.23 21:24 提问

C++模版函数的定义中的形参一定要用引用吗

老师是这样讲的:
template
<返回类型><函数名>(参数表)
{
函数体
}

template
T fuc(T x, int y)
{
T x;
//……
}
如果主调函数中有以下语句:
double d;
int a;
fuc(d,a);
则系统将用实参d的数据类型double去代替函数模板中的T生成函数:
double fuc(double x,int y)
{
double x;
//……
}

然后我是这么写的

template

T min(T x, T y)
{ return (x<y)?x:y; }

main()
{
cout< }
编译不能通过,居然提示
1>------ Build started: Project: test, Configuration: Debug Win32 ------
1>Compiling...
1>test.cpp
1>.\test.cpp(77) : error C2668: 'min' : ambiguous call to overloaded function
1> .\test.cpp(18): could be 'T min(T,T)'
1> with
1> [
1> T=double
1> ]
1> C:\Program Files\Microsoft Visual Studio 8\VC\include\xutility(3197): or 'const _Ty &std::min(const _Ty &,const _Ty &)'
1> with
1> [
1> _Ty=double
1> ]

我开始怎么看都找不到错在哪里,在我看来参数类型很明确了,然后我看了别人的例子,想了下,把模版定义的参数改成了引用
T min(T &x, T &y)
这样就行了,但是我并不明白为什么,这模版函数里也没有一定要改变形参值的语句,只是取数的话,不是直接(T x,T y)就行了么,老师也是这么讲的啊,为什么不行啊。用T min(const T &x,const T &y)也不行

2个回答

oyljerry
oyljerry   Ds   Rxr 2016.02.23 21:59

你不用min 换个名字 mymin

mathdog314
mathdog314   2016.02.23 22:10

C:\Program Files\Microsoft Visual Studio 8\VC\include\xutility(3197): or 'const _Ty &std::min(const _Ty &,const _Ty &)'
这一行报错很明显了,它告诉你你的min和库函数min冲突了。库函数使用了const T&,你只能去重载T&, 也就是可修改版本的。
换个名词就没这些事了。
ps: 慎用using namespace std;

ruisai19830523
ruisai19830523 明白了,多谢哈
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
【C语言】函数参数中的const修饰符
通常,字符串操作函数原型中,都会在形参前面加上const修饰符,表示此指针不能用于修改字符串的值   比如:char *strcpy(char *strDest, const char *strSrc)  但是可不可以通过 在函数里定义一个指针指向strSrc,来改掉字符串的值呢? 给出以下代码: #include #include void fuc(const char *p) {
C++ 引用与引用作为函数的参数
对一个数据建立一个“引用”,他的作用是为一个变量起一个别名。这是C++对C语言的一个重要补充。
什么时候应该将形参定义为引用类型。什么时候不应该将形参定义为引用。
如下情况将形参定义为引用 1.通过形参调用修改函数的值,如swap函数 2.通过一次调用获得多个结果值 3.传递大型对象时,避免复制形参 如下情况不应该将形参定义为引用 1.不需要通过函数调用修改实参的值,如求绝对值的函数
C++引用调用、内联函数、带默认形参值的函数
今天在看鸡啄米的C++系列教程的时候学到了三个有趣的东西:引用调用、内联函数和带默认形参值的函数。 首先是引用调用: 引用调用据百度百科说是C++特有的概念。C++函数调用有三种方式:值调用、引用调用和地址调用。 引用调用时给变量取一个别名,在函数传参数时,和指针一样可以用来改变值。 例如下例: void swap(int& m,int& n){ int t; t=m; m=n
重载运算符时的参数和返回类型要用引用的说明
一·我们举个必须要用重载运算符和重载运算符时必须要使用引用的例子 #include #pragma pack(8) using namespace std; class Myclass { private: char* str; public: Myclass(char* str1 = "default string") { str = new char[strlen(
拷贝构造函数的参数为什么必须是引用?
我们知道类中经常要用到拷贝构造函数,但是在使用的时候有没有想过,为什么他的参数必须是引用? 不是引用不行么?
什么时候用指针形参?什么时候用引用形参?
0.在作为参数的作用中指针和引用的共同特点是都可以在函数中改变实参对象,标准 C 中是没有引用形参的,只能使用指针形参。1.就函数参数传递数值而言,传递指针与传递引用唯一的优势是避免拷贝,同时带来实参被改变的风险,但是可以通过const来尽量避免。2.就为改变实参这个目的而言,指针对于引用的优势在于当你有可能需要传入一个空的概念*(尚未创立的对象,空指针可以表示,而引用无法表示空的概念)的时候,指针
拷贝构造函数的类型为什么必须使用引用类型
有的看着理所当然的东西往往被我们忽略其深层的意义,就像c++ 拷贝构造函数的参数为什么必须是引用类型呢,许多初学者都会说,“为了减少一次内存复制呗!”(其实刚开始我也是这样想的),但究竟是不是这样呢?来,看个小例子(你一定会说:昂....原来是这样啊!); #include using namespace std; class myExample { int mTest; public:
函数中的形参问题(指针形参、引用形参、二重指针作为形参)
(1)用指针传递参数,可以实现对实参进行改变的目的,是因为传递过来的是实参的地址,因此使用*a实际上是取存储实参的内存单元里的数据,即是对实参进行改变,因此可以达到目的。在使用的过程中需要通过对地址的解引用来操作其所指向的变量,同时可以通过指针的自增自减移动从而改变所指向的值,灵活度较大。 (2)引用作为函数参数进行传递时,实质上传递的是实参本身,即传递进来的不是实参的一个拷贝,因此对形
C语言中取地址符&做函数形参?—— 引用的讨论
取地址符&做函数形参? C语言强大且危险 引入这个问题花去了整整一天的研究。先看一段严蔚敏的《数据结构》中栈的例程:这里面的&S第一遍看的时候想当然的认为是取了SqStack结构体的S的地址,没有细想。然后又看到了这句。// platform: VC++6.0 Status Pop(SqStack &S, SElemType &e); //取地址符?我开始突然发现,这真的是取地址符吗,对照了我自