ruisai19830523
ruisai19830523
采纳率0%
2016-02-23 13:24 阅读 2.0k

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 2016-02-23 13:59

    你不用min 换个名字 mymin

    点赞 1 评论 复制链接分享
  • mathdog314 mathdog314 2016-02-23 14: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;

    点赞 评论 复制链接分享

相关推荐