模板类赋值运算符中的模板参数
Template Argument in Template-Class Assignment Operator
我正在尝试编写一个泛型类MyStack
来实现堆栈。我的类中有一个模板变量,类型为 Data
.我还重载了将现有MyStack
对象复制到另一个现有MyStack
对象= operator
。因此,我想在复制之前检查两个类对象是否具有相同类型的变量,即我不希望将 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
应该是一个常量引用。 s
应作为常量引用的类型也是MyStack<Data>
的。
请注意,MyStack
不是实际类型。这是一个"类型工厂"。
总的来说,它应该看起来像
MyStack<Data> &operator=(const MyStack<Data> &s);
这将顺便解决您的问题 - 它只需要对实例化到同一Data
的MyStack
模板的常量引用。
如果您还想支持来自其他堆栈类型的分配,则可以考虑如下内容:
#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
仅为类型定义它 转换为Data
.
相关文章:
- 重载Singly Linked List中的赋值运算符
- 使用赋值运算符重载从类中返回jobject
- 标准库类型的赋值运算符的引用限定符
- 复制构造函数、赋值运算符C++
- 标准::变体的赋值运算符
- 移动赋值运算符;尝试引用已删除的函数.我该如何解决这个问题?
- 基类和派生类的多态赋值运算符
- C++ 通过自定义赋值运算符隐式转换函数参数
- 我可以防止参数隐式转换为赋值运算符吗?
- 为什么在函数参数中使用赋值运算符会失败
- 为什么参数可以在对象初始化时通过赋值运算符传递给构造函数?
- 带有非类型参数的C++模板类:如何重载赋值运算符
- 实际参数列表中的赋值运算符
- 带有右值引用参数的模板赋值运算符与 vs2013 和 gcc 的行为不同
- 在将抽象基类作为参数的函数中将指针和赋值运算符与派生类一起使用
- 模板类赋值运算符中的模板参数
- 如果类类型是按值调用的函数的参数,则会调用该类的重载赋值运算符吗?
- 函数参数 C++ 中的赋值运算符
- 具有不同模板参数的模板类的默认赋值运算符
- 在函数调用的参数中使用赋值运算符