模板类的运算符重载

码农自来也 2009-02-15 06:12:19

template<class T>
class Test{
private:
T n;
const T i;
static int cnt;
public:
Test():i(0){n=0;}
Test(T k);
~Test(){}
void print();
T operator+(T& x);};
template<class T>
int Test<T>::cnt=0;
template<class T>
Test<T>::Test(T k):i(k){n=k;cnt++;}
template<class T>
void Test<T>::print(){
std::cout<<"n="<<n<<std::endl;
std::cout<<"i="<<i<<std::endl;
std::cout<<"cnt="<<cnt<<std::endl;

}
template<class T>
T Test<T>::operator+(T& x){
return n + x;
}


有上面这个类,我要怎么样调用它的重载了的运算符呢?
...全文
306 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
hangyu628 2009-02-15
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 xunlei842 的回复:]
有两个问题:
1,成员函数的实现不能写在外面,我的VC里面是只能写在类里面;
2,你的带参构造函数没有对常成员i进行初始化赋值,对于常数据成员,只能以参数列表的形式赋初始化值,如果不赋初始化值,main 函数中的t2和t3这两个对象构造会在编译时出错。
3,不要有std::前缀,我的VC会报…
[/Quote]


这位兄弟,帮你改正一下,
1,模板成员函数可以写在外面,只是,由于现在的编译器,不支持。不支持,实现与定义分离在不同的文件(.h.cpp分开)。
2,参数成员也可在外面赋值,建议看看,Primer.
3,是因为VC6对标准C++支持性极不好的原因,建议,你看看Primer,有空看一下标准C++。
4,是因为他的重载函数 的参数( T& x ),若用int型传过去的话,int &x,得用变量传。
码农自来也 2009-02-15
  • 打赏
  • 举报
回复
4楼和6楼的代码都是可行的,谢谢你们。
回复7楼,我用的是DEV C++ ,它们对C++标准的支持不一样,VC++对标准的支持不好。其实成员函数是可以在体外定义的,这是课本上说的;我的带参数的构造函数是有对常成员的初始化的,但是是写在了这个函数的实现那里去了,也许你删掉我的实现的时候把它给删了;std这个前缀是指明cout这个全局变量在std这个命名空间里面的。我的愚见
xunlei842 2009-02-15
  • 打赏
  • 举报
回复

int main(void)
{
Test<int> t1,t2(21),t3(23);
int i=33;
cout<<t3+i;

cout<<endl;
return 0;
}

有两个问题:
1,成员函数的实现不能写在外面,我的VC里面是只能写在类里面;
2,你的带参构造函数没有对常成员i进行初始化赋值,对于常数据成员,只能以参数列表的形式赋初始化值,如果不赋初始化值,main 函数中的t2和t3这两个对象构造会在编译时出错。
3,不要有std::前缀,我的VC会报错,为什么我不知道。

另外,你重载的+接收的参数是模板参数T类型的,我在main函数中用的是int型,所以t3加上整形值即中,但不能加常数,要以变量形式出现,这个怎么解释,我不太清楚。你的重载的函数返回的也是T类型的,在main函数中相当于int型,所以我直接输出了。

hangyu628 2009-02-15
  • 打赏
  • 举报
回复
程序如下

#include <iostream>
using namespace std;

template<class T>
class Test
{
private:
T n;
const T i;
static int cnt;
public:
Test():i(0){n=0;}
Test(T k);
~Test(){}
void print();
T operator+(T& x);
};
template<class T>
int Test<T>::cnt=0;
template<class T>
Test<T>::Test(T k):i(k)
{
n=k;cnt++;
}
template<class T>
void Test<T>::print()
{
std::cout<<"n="<<n<<std::endl;
std::cout<<"i="<<i<<std::endl;
std::cout<<"cnt="<<cnt<<std::endl;

}
template<class T>
T Test<T>::operator+(T& x)
{
return n + x;
}

int main()
{
int i=1;
Test<int> a(1);
cout<<a+i<<endl;
return 0;
}

hangyu628 2009-02-15
  • 打赏
  • 举报
回复
先把你的程序,改可读一点
template<class T>
class Test
{
private:
T n;
const T i;
static int cnt;
public:
Test():i(0){n=0;}
Test(T k);
~Test(){}
void print();
T operator+(T& x);
};
template<class T>
int Test<T>::cnt=0;
template<class T>
Test<T>::Test(T k):i(k)
{
n=k;cnt++;
}
template<class T>
void Test<T>::print()
{
std::cout<<"n="<<n<<std::endl;
std::cout<<"i="<<i<<std::endl;
std::cout<<"cnt="<<cnt<<std::endl;

}
template<class T>
T Test<T>::operator+(T& x)
{
return n + x;
}

int main()
{
return 0;
}
baihacker 2009-02-15
  • 打赏
  • 举报
回复
#include <iostream>
using namespace std;
template<class T>
class Test{
private:
T n;
const T i;
static int cnt;
public:
Test():i(0){n=0;}
Test(T k);
~Test(){}
void print();
T operator+(const T& x);//用const
};
template<class T>
int Test<T>::cnt=0;

template<class T>
Test<T>::Test(T k):i(k){n=k;cnt++;}

template<class T>
void Test<T>::print()
{
std::cout<<"n="<<n<<std::endl;
std::cout<<"i="<<i<<std::endl;
std::cout<<"cnt="<<cnt<<std::endl;

}
template<class T>
T Test<T>::operator+(const T& x){//用const
return n + x;
}


int main(void)
{
Test<int> a(1);
cout << a+1 << endl;

return 0;
}
码农自来也 2009-02-15
  • 打赏
  • 举报
回复
应该没了吧,编译上面这个类是没错的
lei_zhuyan 2009-02-15
  • 打赏
  • 举报
回复
在你的代码里面,根本没有定义 template<class T> class Test 的+运算符

你的return n+x肯定就是错的、

lei_zhuyan 2009-02-15
  • 打赏
  • 举报
回复
你的代码里面还有很多错误吧

64,648

社区成员

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

试试用AI创作助手写篇文章吧