我正在尝试编写一个通用类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);
您遇到许多问题(请参阅overloading special members):
MyStack<Data> &
。 s
应该是const引用。 s
应该作为const引用的类型也为MyStack<Data>
。 请注意,
MyStack
不是实际的类型。这是一个“类型工厂”。总的来说,它看起来应该像
MyStack<Data> &operator=(const MyStack<Data> &s);
附带地,这将解决您的问题-它仅对实例化为相同
MyStack
的Data
模板进行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
定义它。 关于c++ - 模板类分配运算符中的模板参数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35453378/