Двоичный файл '[': не найден оператор, который принимает левый операнд типа const Stack <int> - PullRequest
0 голосов
/ 20 апреля 2020

Я сделал реализацию стека (с односвязным списком, также реализованным мной), и при попытке перегрузить оператор «<<» для отображения я столкнулся с этой проблемой. </p>

Вот мой стек:

template <class T>
class Stack
{
    public:
        LinkedList<T> stack;
        int Length;

        Stack() {
            Length = 0;
        }

        void Push(const T value) {
            stack.Add(value);
            Length = stack.Length;
        }

        T Pop() {
            T value = stack[0];
            stack.Delete(0);
            Length = stack.Length;
            return value;
        }

        T operator[](const int index) {
            return stack[index];
        }

        friend std::ostream& operator <<(std::ostream& os, const Stack<T>& s) { //const here causes error
            for (int i = 0; i < s.Length; i++)
                os << s[i] << " ";
            return os;
        }
};

Оператор индексирования [] работает нормально Я запустил следующий код в main для проверки стека:

Stack<int> stack;
stack.Push(10);
stack.Push(5);
stack.Push(11);
std::cout << stack[1] << std::endl; // prints 5 as expected

Но при попытке распечатать все содержимое стека с помощью std::cout << stack; it дает мне ошибку, упомянутую в названии. Удаление ключевого слова const из-за перегрузки операторов решает эту проблему, но, как я знаю, не рекомендуется передавать объекты, которые не должны быть изменяемыми, без ключевого слова const.

Как заставить код работать без удаления ключевого слова const?

Ответы [ 2 ]

1 голос
/ 20 апреля 2020

Обычно должно быть две перегрузки для доступа к элементу. Один для экземпляра const, который возвращает постоянную ссылку:

    const T& operator[](const int index) const {
        return stack[index];           // ^^ -----------
    }

И один, который возвращает ссылку:

    T& operator[](const int index) {
        return stack[index];
    }

Если вы предоставите тот, который возвращает неконстантную ссылку, до вас, но вы получили ошибку, потому что у вас нет operator[] для const Stack.

PS: обратите внимание, что const на параметре не является частью сигнатуры метода, а имеет только смысл внутри метода. Вы можете объявить метод как T& operator[](int index), и это будет тот же метод. const здесь только запрещает вам изменять index внутри метода.

1 голос
/ 20 апреля 2020

Ваш operator[] неконстантен, поэтому компилятор жалуется.

Вы можете добавить перегрузку const, чтобы заставить меня работать:

T operator[](const int index) const {
    return stack[index];
}
...