模板堆栈类的复制构造函数中的pop()和push()不起作用

时间:2017-03-21 13:27:35

标签: c++ templates stack copy-constructor

当我在复制构造函数中使用原始堆栈的push()pop()函数时,它会给出以下错误:

  

[错误]将'const Stack'作为'void'的'this'参数传递   Stack :: pop()[with type = int]'丢弃限定符   [-fpermissive]

如何使用push和pop将一个堆栈复制到另一个堆栈?

template <class type> Stack<type>::Stack(const Stack<type> & originalStk)
{
    MAXSIZE=originalStk.getSize();
    list = new type[MAXSIZE];
    top = -1;

    if(!originalStk.isEmpty())
    {
        Stack<type> temp(originalStk.getSize());
        while(!originalStk.isEmpty())
        {
            temp.push(originalStk.topVal());
            originalStk.pop();
        }
        while(!temp.isEmpty())
        {
            originalStk.push(temp.topVal());
            push(temp.topVal());
            temp.pop();
        }   
    }
    else
    {

    }
}

1 个答案:

答案 0 :(得分:0)

const Stack<type> & originalStk是堆栈的const&

这意味着您承诺不通过此引用修改它。

pop修改堆栈。不要将pop上的const&拨打到堆栈。

您的代码可以修改为支持template <class type> Stack<type>::Stack(Stack<type>&& originalStk)

但是,如果不使用poppush以及topVal进行变更,则无法复制堆栈。您必须使用更丰富的接口将复制构造函数(使用const&)写入堆栈。

由于你属于这种类型,这很容易。

MAXSIZE=originalStk.getSize();
list = new type[MAXSIZE];
top = -1;
std::copy(originalStk.list, origialStk.list+MAXSIZE, (type*)list);
top = originalStk.top;

现在,您使用new和手动指针生命周期管理是代码味道。将list替换为unique_ptr<type[]>,或将所有3个状态变量替换为std::vector<type>