[英]Template Argument in Template-Class Assignment Operator
我正在尝试编写一个通用类MyStack
来实现堆栈。 我的类中有一个类型为Data
的模板变量。 我还要重载= operator
以将现有的MyStack
对象复制到另一个现有的MyStack
对象。 因此,我想在复制之前检查两个类对象是否具有相同类型的变量,即,我不希望将float
类型的对象复制到int
类型的对象。 什么是完成此任务的好方法?
MyStack
定义:
template<typename Data>
class MyStack
{
Data *data;
int pos;
int Max;
MyStack();
public:
MyStack(int);
int push(const Data);
int push(const Data *,const Data);
Data pop();
Data* pop(const int);
int getMaxSize();
int currSize();
int isEmpty();
void display();
MyStack(const MyStack &);
void operator=(const MyStack s);
~MyStack();
};
这是运算符重载部分:
template<typename Data>
void MyStack<Data>::operator=(const MyStack s)
{
cout<<"Copied with operator overloading"<<endl;
delete[] data;
data=new Data[s.Max];
Max=s.Max;
pos=s.pos;
for(int i=0;i<=s.pos;i++)
data[i]=s.data[i];
}
提前致谢。
在声明中
void operator=(const MyStack s);
您遇到了许多问题(请参阅重载特殊成员 ):
MyStack<Data> &
。 s
应该是const引用。 s
应该是const引用的类型也是MyStack<Data>
。 请注意, MyStack
不是实际的类型。 这是一个“类型工厂”。
总体而言,它看起来应该像
MyStack<Data> &operator=(const MyStack<Data> &s);
顺带MyStack
这将解决您的问题-它仅对实例化为相同Data
MyStack
模板进行const引用。
如果您还希望支持其他堆栈类型的分配,则可以考虑以下内容:
#include <type_traits>
template<typename Data>
class MyStack
{
...
template<typename OtherData>
typename std::enable_if<
std::is_convertible<OtherData, Data>::value,
MyStack<Data> &>::type
operator=(const MyStack<OtherData> &other);
};
它使用:
std::is_convertible
检查OtherData
是否可转换为Data
std::enable_if
仅将类型convertibel定义为Data
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.