我正在尝试编写一个通用类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);
    

    附带地,这将解决您的问题-它仅对实例化为相同MyStackData模板进行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/

    10-11 18:15