Быстрый вопрос: почему не работает мой вызов pop ()? С ++ Стеки - PullRequest
0 голосов
/ 28 апреля 2020

Я изучаю стеки в моем текущем курсе CS. Я работал над функциями, и когда я пошел на тестирование, для функции pop я получил ошибку: «нет соответствующей функции для вызова DynStack :: pop ()»

Вот мой код:

main ()

#include <iostream>
#include <cstddef>
#include "src\DynStack.cpp"
#include "DynStack.h"

using namespace std;


int main()
{
    DynStack<char>cstack;
    cstack.push('A');
    cstack.push('B');
    cstack.push('C');

    cstack.pop();

    cout << cstack.top->value << endl;

    return 0;
}

DynStack. cpp

#include "DynStack.h"
#include <cstddef>

template<typename T>
DynStack<T>::DynStack()
{
    top = NULL;
}

template<typename T>
void DynStack<T>::push(T val)
{
    StackNode *nodePtr; // ptr to traverse thru the stack

    StackNode *newNode;
    newNode = new StackNode; // makes a new StackNode
    newNode->value = val;
    newNode->next = NULL;

    if (top == NULL) // If the stack is empty
    {
        top = newNode; // Make newNode the first node;
    }
    else
    {
        nodePtr = top; // make our ptr = top

        nodePtr->next = newNode; // make the node after the top our newNode

        top = newNode; // newNode is our new top of the stack
    }
}

template <typename T>
void DynStack<T>::pop(T &)
{
    StackNode *nodePtr; // makes a nodePtr to traverse the stack

    if (top == NULL)
    {
        return;
    }
    else
    {
        nodePtr = top;
        nodePtr = top--;
        delete top;
        top = nodePtr;
        delete nodePtr;
    }

}




template <typename T>
DynStack<T>::~DynStack()
{
    //dtor
}

DynStack.h

#ifndef DYNSTACK_H
#define DYNSTACK_H

template <typename T>
class DynStack
{
    private:
        struct StackNode
        {
            T value;
            StackNode *next;
        };

        StackNode *top;

    public:
        DynStack();
        ~DynStack();
        void push(T);
        void pop(T&);
        bool isEmpty();
};

#endif // DYNSTACK_H

Я еще очень рано проверяю это программа. Я предполагаю, что мне нужно что-то поместить в скобки cstack.pop (); но я не знаю, что бы я там поместил? Поп будет просто удалить значение да? Я не думаю, что это потребует какой-либо информации.

Если бы это была моя программа, я бы подумал убрать T & из пустого DynStack :: pop (T &), но мой профессор написал об этом. Я предполагаю, что он положил это там, так что я должен был изучить это Погуглил кучу, но не приближаюсь.

Спасибо вам всем.

1 Ответ

0 голосов
/ 28 апреля 2020

В вашем коде

void pop(T&);

T & означает, что эта функция ожидает (ссылочный) аргумент типа T (в вашем случае char). Вы не предоставили его, поэтому код не компилируется. Вам нужно добавить переменную char в ваш код

char x;
cstack.pop(x);
cout << "the top item on the stack was " << x << endl;

Я думаю, что вам не хватает того, что pop не только удаляет элемент из стека, но и «возвращает» этот элемент через ссылку arugment.

...