繁体   English   中英

模板类分配运算符中的模板参数

[英]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);

您遇到了许多问题(请参阅重载特殊成员 ):

  1. 返回类型应为MyStack<Data> &
  2. s应该是const引用。
  3. 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);
};

它使用:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM