以下是简单的代码。
#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类,而前者可以,为什么?
#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=
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; }