передача 'function as' this 'аргумента' function 'отбрасывает квалификаторы [-fpermissive] - PullRequest
0 голосов
/ 02 октября 2018

Один из моих конструкторов копирования для моего стека ADT, использующий связанный список, кажется, работает в основном за исключением одной ошибки, которую он вызывает.Очевидно, это как-то связано с тем, что «другой» StackLinked является константным типом, а функция pop () меняет его, но может объяснить мне, как я могу это сделать, сохранив «другой», если это возможно, постоянным.Если нет, то как еще я могу это сделать?

Вот конструктор копирования:

template <typename DataType>
StackLinked<DataType>::StackLinked(const StackLinked<DataType> & other)
{   
    int tempSize = other.getSize();
    StackLinked<DataType> temp = StackLinked<DataType>();
    for(int i = 0; i < tempSize; i++)
    {
        temp.push(other.pop()); //error is on this line on the pop function
    }

    for(int i = 0; i < tempSize; i++)
    {
        push(temp.pop());
    }
}

Вот функции pop () и push ():

template <typename DataType>
DataType StackLinked<DataType>::pop()
{  
        StackNode * temp = top->next;
        delete top;
        top = temp;
        size--;  
}
template <typename DataType>
    void StackLinked<DataType>::push(const DataType & newDataItem) 
    {
        StackNode * temp = top;
        top = new StackNode(newDataItem, temp);
        size++;
    }

А основная функция просто создает новый объект StackLinked:

#include "StackLinked.h"
#include "StackLinked.cpp"
#include <iostream>

using namespace std;

int main(void)
{
    StackLinked<int> test = StackLinked<int>();
}

Наконец, ошибка:

StackLinked.cpp:21:9: error: passing ‘const StackLinked<int>’ as ‘this’ argument of ‘DataType StackLinked<DataType>::pop() [with DataType = int]’ discards qualifiers [-fpermissive]
         temp.push(other.pop());

1 Ответ

0 голосов
/ 02 октября 2018

, но мог бы объяснить мне, как я могу сделать это, сохраняя "other" по-прежнему постоянным, если это возможно.

Вместо использования other.pop(), вы можете просто использоватьпеременные-члены other напрямую.

template <typename DataType>
StackLinked<DataType>::StackLinked(const StackLinked<DataType> & other)
{   
    StackLinked<DataType> temp = StackLinked<DataType>();
    StackNode<DataType>* node = other.top;
    while ( node != nullptr )
    {
        temp.push(node->data); // I am guessing data is a member variable of StackNode.
                               // If not, use the right member variable.
        node = node->next;
    }

    node = temp.top;
    while ( node != nullptr )
    {
        push(node->data);
        node = node->next;
    }
}
...