我正在尝试编写泛型类MyStack
来实现Stack。我的类中有一个模板变量,类型名为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];
}
提前致谢。
答案 0 :(得分:1)
在声明中
void operator=(const MyStack s);
您遇到了许多问题(请参阅overloading special members):
MyStack<Data> &
。s
应该是const引用。s
应该是const引用的类型,也是MyStack<Data>
。请注意MyStack
不是实际类型。这是一个“类型工厂”。
总的来说,它应该看起来像
MyStack<Data> &operator=(const MyStack<Data> &s);
这将偶然解决您的问题 - 它只会将MyStack
模板的const引用实例化为同一Data
。
如果您还想支持其他堆栈类型的分配,您可能会考虑以下内容:
#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
。