为什么函数调用有错误????

NesTa_xP 2008-02-19 09:42:20
//习题2.6
#include<iostream>
#include<string>
#include<vector>
using namespace std;
template<typename T>
T max(T a,T b)
{
return a>b?a:b;
}
template<typename V>
V max(vector<V> ivec)
{
V maxint=ivec[0];
for(int ix=0;ix<ivec.size();++ix)
if(ivec[ix]>maxint)
maxint=ivec[ix];
return maxint;

}
template<typename A>
A max(A a[],size_t i)
{

A maxint=a[0];
for(int ix=0;ix<i;++ix)
if(a[ix]>maxint)
maxint=a[ix];
return maxint;
}

int main()
{
int i_a=8,i_b=9;
double d_a=7.7,d_b=8.8;
string s_a="you";
string s_b="xiao";
int ia[]={2,5,7,4,9};
double da[]={2.5,5.6,1.9,6.4,6.8};
string sa[]={"you","xiao","lu","yi","jun"};
size_t size=5;
vector<int> ivec(ia,ia+5);
vector<double> dvec(da,da+5);
vector<string> svec(sa,sa+5);

int a=max(i_a,i_b);
double b=max(d_a,d_b);
string c=max(s_a,s_b);
int d=max(ivec);
double e=max(dvec);
string f=max(svec);
int g=max(ia,size);
double h=max(da,size);
string i=max(sa,size);
}


...全文
154 16 打赏 收藏 转发到动态 举报
写回复
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
jinzhou520 2008-07-12
  • 打赏
  • 举报
回复
刚看到一则这个信息.不知道是不是这个的原因.
http://www.cnblogs.com/walkingmu/archive/2007/11/06/951400.html
ttzzgg_80713 2008-02-20
  • 打赏
  • 举报
回复
关掉std命名空间应该可以鸟吧
jieao111 2008-02-20
  • 打赏
  • 举报
回复
vc对模板支持不好。。。。。。。。
NesTa_xP 2008-02-20
  • 打赏
  • 举报
回复
恩,反正就是不要调用std里的max就行了吧.
visame 2008-02-20
  • 打赏
  • 举报
回复
to NesTa_xP:
还真是奇怪了!我这个G++可以运行通过,转到VC2005下就不行了。怪事,怪事。。。

那就用楼上几位的方法吧!郁闷。。。
不过你用起来更加郁闷,每次遇到max(T,T)类型都要指名是当前的::还是std::的。
去掉算了。
HelloDan 2008-02-19
  • 打赏
  • 举报
回复
你自己试一下不就知道了吗?可以啊。
NesTa_xP 2008-02-19
  • 打赏
  • 举报
回复
既然这样 原来的代码什么都不该 前3个都加上::可以吗???
HelloDan 2008-02-19
  • 打赏
  • 举报
回复
或者你也可以指定用std的。这样就行了。

string c=std::max(s_a,s_b);
HelloDan 2008-02-19
  • 打赏
  • 举报
回复
这样表示不是用std命名空间的,而是用你上面定义的。
NesTa_xP 2008-02-19
  • 打赏
  • 举报
回复
请问为什么要将这里
string c=::max(s_a,s_b); //这里指定用全局中定义的。
NesTa_xP 2008-02-19
  • 打赏
  • 举报
回复
怎么还是一样的问题呢?
1>..\2_6.cpp(52) : error C2668: “MYMAX::max”: 对重载函数的调用不明确

//习题2.6
#include<iostream>
#include<string>
#include<vector>
using namespace std;
namespace MYMAX
{
template<typename T>
T max(T a,T b)
{
return a>b?a:b;
}
template<typename V>
V max(vector<V> ivec)
{
V maxint=ivec[0];
for(int ix=0;ix<ivec.size();++ix)
if(ivec[ix]>maxint)
maxint=ivec[ix];
return maxint;

}
template<typename A>
A max(A a[],size_t i)
{

A maxint=a[0];
for(int ix=0;ix<i;++ix)
if(a[ix]>maxint)
maxint=a[ix];
return maxint;
}
}

int main()
{
using MYMAX::max;
int i_a=8,i_b=9;
double d_a=7.7,d_b=8.8;
string s_a="you";
string s_b="xiao";
int ia[]={2,5,7,4,9};
double da[]={2.5,5.6,1.9,6.4,6.8};
string sa[]={"you","xiao","lu","yi","jun"};
size_t size=5;
vector<int> ivec(ia,ia+5);
vector<double> dvec(da,da+5);
vector<string> svec(sa,sa+5);

int a=max(i_a,i_b);
double b=max(d_a,d_b);
string c=max(s_a,s_b);
int d=max(ivec);
double e=max(dvec);
string f=max(svec);
int g=max(ia,size);
double h=max(da,size);
string i=max(sa,size);
cout<<a<<" "<<b<<" "<<c<<" "<<d<<" "<<e<<" "<<f<<" "<<g<<" "<<h<<" "<<i<<" ";
}


HelloDan 2008-02-19
  • 打赏
  • 举报
回复

#include<iostream>
#include<string>
#include<vector>

//不要将namespace std里面太多东西都包含进来。
using std::size_t;
using std::vector;
using std::string;


template<typename T>
T max(T a,T b)
{
return a>b?a:b;
}

template<typename V>
V max(vector<V> ivec)
{
V maxint=ivec[0];
for(size_t ix=0;ix<ivec.size();++ix)
if(ivec[ix]>maxint)
maxint=ivec[ix];
return maxint;

}

template<typename A>
A max(A a[],size_t i)
{

A maxint=a[0];
for(size_t ix=0;ix<i;++ix)
if(a[ix]>maxint)
maxint=a[ix];
return maxint;
}

int main()
{
int i_a=8,i_b=9;
double d_a=7.7,d_b=8.8;
string s_a="you";
string s_b="xiao";
int ia[]={2,5,7,4,9};
double da[]={2.5,5.6,1.9,6.4,6.8};
string sa[]={"you","xiao","lu","yi","jun"};
size_t size=5;
vector<int> ivec(ia,ia+5);
vector<double> dvec(da,da+5);
vector<string> svec(sa,sa+5);

int a=max(i_a,i_b);
double b=max(d_a,d_b);
string c=::max(s_a,s_b); //这里指定用全局中定义的。
int d=max(ivec);
double e=max(dvec);
string f=max(svec);
int g=max(ia,size);
double h=max(da,size);
string i=max(sa,size);
return 0;
}

war3gu 2008-02-19
  • 打赏
  • 举报
回复
猛一看一切都正常,1楼的解释应该是正确的.
visame 2008-02-19
  • 打赏
  • 举报
回复

/*
除了上面的去掉方法外,
我用了一个笨方法解决了。
等待高手提出更好的方法!!!
下列平台运行通过:
gcc version 3.2 20020903 (Red Hat Linux 8.0 3.2-7)
*/
1 #include<iostream>
2 #include<string>
3 #include<vector>
4 using namespace std;
5 namespace MYMAX//这里加上一个命名空间,强迫其调用你自己的这个模版
6 {
7 template<typename T>
8 T max(T a,T b)
9 {
10 return a>b?a:b;
11 }
12 template<typename V>
13 V max(vector<V> ivec)
14 {
15 V maxint=ivec[0];
16 for(int ix=0;ix<ivec.size();++ix)
17 if(ivec[ix]>maxint)
18 maxint=ivec[ix];
19 return maxint;
20
21 }
22 template<typename A>
23 A max(A a[],size_t i)
24 {
25
26 A maxint=a[0];
27 for(int ix=0;ix<i;++ix)
28 if(a[ix]>maxint)
29 maxint=a[ix];
30 return maxint;
31 }
32 }
33 int main()
34 {
35 using MYMAX::max;//在这里殖民调用你自己的那些模版
36 int i_a=8,i_b=9;
37 double d_a=7.7,d_b=8.8;
38 string s_a="you";
39 string s_b="xiao";
40 int ia[]={2,5,7,4,9};
41 double da[]={2.5,5.6,1.9,6.4,6.8};
42 string sa[]={"you","xiao","lu","yi","jun"};
43 size_t size=5;
44 vector<int> ivec(ia,ia+5);
45 vector<double> dvec(da,da+5);
46 vector<string> svec(sa,sa+5);
47
48 int a=max(i_a,i_b);
49 double b=max(d_a,d_b);
50 string c=max(s_a,s_b);
51 int d=max(ivec);
52 double e=max(dvec);
53 string f=max(svec);
54 int g=max(ia,size);
55 double h=max(da,size);
56 string i=max(sa,size);
57 cout<<c<<endl;
58 }
NesTa_xP 2008-02-19
  • 打赏
  • 举报
回复
跟标准库里的max函数形参都一样??????????
visame 2008-02-19
  • 打赏
  • 举报
回复

1 #include<iostream>
2 #include<string>
3 #include<vector>
4 using namespace std;
5
6 /*这个函数去掉就可以了,居然std里面有一个重载的函数。
7 template<typename T>
8 T max(T a,T b)
9 {
10 return a>b?a:b;
11 }
12 */
13 template<typename V>
14 V max(vector<V> ivec)
15 {
16 V maxint=ivec[0];
17 for(int ix=0;ix<ivec.size();++ix)
18 if(ivec[ix]>maxint)
19 maxint=ivec[ix];
20 return maxint;
21
22 }
23 template<typename A>
24 A max(A a[],size_t i)
25 {
26
27 A maxint=a[0];
28 for(int ix=0;ix<i;++ix)
29 if(a[ix]>maxint)
30 maxint=a[ix];
31 return maxint;
32 }
33....................
相关推荐

63,594

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下