重载类模板函数问题

weixin_35654628 2016-08-21 12:03:10
以下是简单的代码。
#include<iostream>
using namespace std;
class date //创建一个类
{
int month,day,year;
public:
date(int m=0,int d=0,int y=0)
{
month=m;
day=d;
year=y;
}
friend ostream& operator<<(ostream& os,const date t) //重载<<
{
cout<<t.month<<' '<<t.day<<' '<<t.year<<endl;
return os;
}
};
template<class T> //创建一个类模板
class set
{
T t;
public:
set(T st):t(st) {} //标记为疑问2
void display();
};
template<class T>
void set<T>::display()
{
cout<<t<<endl;
}
void set<date>::display() //这里出错,但不知道如何解决。我想实现当类模板的的参数是一个类的时候,display执行这个函数
{
cout<<"date:"<<t<<endl;
}
int main()
{
set<int> inset(123);
set<date> dt=date(1,2,3);
inset.display();
dt.display();
return 0;
}
结果报错了。错误报告如下
[Error] specializing member 'set<date>::display' requires 'template<>' syntax。
问题一:怎么改正?
问题二:代码中标记为疑问2处,set(T st):t(st) {}不是与set(T st){ t=st }等价吗?但是使用后者代码时,类模板参数不能为date类,而前者可以,为什么?
...全文
194 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
iyomumx 2016-08-21
  • 打赏
  • 举报
回复
1.错误报告很明显了:在 void set<date>::display 前面加 template<> 即可 2.不等价,前者调用 T 的复制构造函数来构造 t ,后者调用 T 的默认构造函数来构造 t ,然后再执行 t=st; ,这里则使用 operator=
weixin_35654628 2016-08-21
  • 打赏
  • 举报
回复
谢谢,你的回复很有用,现在我把display改为这样T display();,返回类型不为空。我想设置当参数为一个类时,返回0;如下 template<class T> T set<T>::display() { cout<<t<<endl; } template<> int set<date>::display() { cout<<"date:"<<t<<endl; return 0; } 又报错了 [Error] template-id 'display<>' for 'int set<date>::display()' does not match any template declaration [Note] saw 1 'template<>', need 2 for specializing a member function template。 这要怎么修改呢
paschen 版主 2016-08-21
  • 打赏
  • 举报
回复
模板特化时要加上template<>
#include<iostream>
using namespace std;
class date       //创建一个类
{
	int month,day,year;
public:
	date(int m=0,int d=0,int y=0)
	{
		month=m;
		day=d;
		year=y;
	}
	friend ostream& operator<<(ostream& os,const date t)   //重载<<
	{
		cout<<t.month<<' '<<t.day<<' '<<t.year<<endl;
		return os;
	}
};
template<class T>  //创建一个类模板
class set
{
	T t;
public:
	set(T st):t(st) {}  //标记为疑问2
	void display();
};
template<class T>
void set<T>::display()
{
	cout<<t<<endl;
}
template<>
void set<date>::display()   //这里出错,但不知道如何解决。我想实现当类模板的的参数是一个类的时候,display执行这个函数
{
	cout<<"date:"<<t<<endl;
}
int main()
{
	set<int> inset(123);
	set<date> dt=date(1,2,3);
	inset.display();
	dt.display();
	return 0;
}
iyomumx 2016-08-21
  • 打赏
  • 举报
回复
因为 display 是模板类的成员函数,声明
template<> int set<date>::display()
则是对模板类的成员函数的特化,但返回值类型与模板不匹配,这是不允许的。 如果你需要修改 set<date> 的行为,那么应该特化模板类 set<T>
template <class T> class set { T display(); };  //声明
template<> class set<date> { int display(); };  //特化

64,637

社区成员

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

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