模板类赋值运算符中的模板参数

时间:2016-02-17 09:59:28

标签: c++ templates overloading

我正在尝试编写泛型类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];
}

提前致谢。

1 个答案:

答案 0 :(得分:1)

在声明中

void operator=(const MyStack s);

您遇到了许多问题(请参阅overloading special members):

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

    这使用: