重载类模板函数问题

C++语言 码拜 5年前 (2016-06-06) 596次浏览
以下是简单的代码。
#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类,而前者可以,为什么?
解决方案

20

1.错误报告很明显了:在 void set<date>::display 前面加 template<> 即可
2.不等价,前者调用 T 的复制构造函数来构造 t ,后者调用 T 的默认构造函数来构造 t ,然后再执行 t=st; ,这里则使用 operator=

10

原因是 display 是模板类的成员函数,声明

template<> int set<date>::display()

则是对模板类的成员函数的特化,但返回值类型与模板不匹配,这是不允许的。
假如你需要修改 set<date> 的行为,那么应该特化模板类 set<T>

template <class T> class set { T display(); };  //声明
template<> class set<date> { int display(); };  //特化

20

模板特化时要加上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;
}

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明重载类模板函数问题
喜欢 (0)
[1034331897@qq.com]
分享 (0)