C++类模板的一个简单问题

来源:百度知道 编辑:UC知道 时间:2024/07/01 05:19:01
如下:
#include<iostream>
using namespace std;
#include<cstdlib>
class Mytype
{
public:
int value;
Mytype (int i);
int compare(Mytype y);
};
Mytype ::Mytype (int i)
{
value=i;
}
int Mytype ::compare(Mytype y)
{
if(value>y.value)
return 1;
else
return -1;
}
template <class TYPE> //定义函数模板

TYPE max(TYPE x,TYPE y)
{
return (x.value>y.value)?x.value:y.value;
}

void main()
{
int a,b;
a=rand();
b=rand();
Mytype A(a),B(b);
cout<<"A的值为:"<<a<<endl;
cout<<"B的值为:"<<b<<endl;
cout<<"它们的最大值为:"<<max(A,B)<<endl;
return;
}
这个倒数第二行有个问题
cout<<"它们的最大值为:"<<max(A,B)<<endl;
这里调用函数模板时,传进去的是类的两个对象,然后在模板里比较大小,为什么会出错呢
我把他改成
cout<<"

咱来看
template <class TYPE> //定义函数模板

TYPE max(TYPE x,TYPE y)
{
return (x.value>y.value)?x.value:y.value;
}
模板函数max接受两个相同类型的参数,返回与参数类型相同的值。但是,当你如此调用时:
max(A, B);
Type被实例化为类型Mytype,即此时max被特例化为
Mytype max(Mytype A, Mytype B);
由于你返回的是一个Mytype::value,它是整型的,编译器看了看,发现返回类型应该是Mytype才对啊!又发现,Mytype的构造函数可以接受一个整型值,于是乎,编译就用你要返回的int值构造了一个临时的Mytype对象返回了。就相当于:
return Mytype((x.value>y.value)?x.value:y.value);
所以说,max返回的是一个Mytype类型的对象,你又没有重载<<操作符,那么cout<<max(A, B)<<endl;就报错了!后面加个.value也就行了,因为那是个int!

TYPE max(TYPE x,TYPE y)
{
return (x.value>y.value)?x.value:y.value;
}
你返回的不是class么,怎么又写x.value,想返回value么就应该是int max(...){}

TYPE max(TYPE x,TYPE y)
你的返回值也是TYPE 啊,还真不知道怎么返回的

估计是给编译器优化了,反正返回值是和输入的类型一样的

max(A,B)函数模板写错了,函数体返回的是int型的value变量,函数返回类型却是TYPE,这样会调用INT型转换为TYPE的构造函数,到最后你又要使用INT,这里的转换时多余的,所以把函数模板的返回类型改成INT就可以了