Связанные списки Ошибка C ++ (невозможно преобразовать 'Type' в 'const ChainNode <Type>') - PullRequest
0 голосов
/ 30 апреля 2020

Я пытаюсь передать последовательность символов в связанный список, но эта ошибка дошла до меня, и я понятия не имею, что это может быть.

Невозможно преобразовать тип to 'const ChainNode '

Вот что у меня есть:

#include <iostream>

using namespace std;

template <class Type> class Chain;
template <class Type> class ChainNode;
template <class Type>
class Stack
{
    friend class Chain <Type>;
public:
    Stack(int MaxStackSize = DefaultSize);
    //~Stack();
    bool Full();
    bool Empty();
    Type& Top();
    void Push(const Type& item);
    Type Pop(Type&);
    void Print();
    void Read(char x[], int size, Chain <Type> input_chain);

private:
    int MaxSize;
    int top;
    Type* stack;
    char a;
};

У меня проблемы с этой функцией, которая на самом деле не имеет значения, поскольку ошибка не связана с алгоритмом, это что-то об аргументах в классах на C ++.

template <class Type>
void Stack<Type>::Read(char x[], int size, Chain <Type> input_chain) {
    int count = 0;
    for (int i = 0; i < size; i++)
    {
        count++;
        if (Empty()) {
            if (x[i] == '+' or x[i] == '*') {
                Push(x[i]);
                break;
            }
            else{
                cout << x[i];
                input_chain.attach(x[i]);       //<-- Here is the problem
            }   
        }
    }
//Node of the chain declaration

template <class Type>
class ChainNode
{
    friend class Stack <Type>;
    friend class Chain <Type>;
public:
    ChainNode() {};
    //~ChainNode();

private:
    Type character;
    ChainNode* link;
};

Ошибка связана с функцией void в этом классе:

//Chain class declaration

template <class Type>
class Chain
{
    friend class Stack <Type>;
    friend class ChainNode <Type>;
public:
    Chain() {
        first = 0;
        last = 0;
    };
    void attach(Type& k) {
        ChainNode<Type>* newnode = new ChainNode<Type> (k);
        if (first == 0) first = last = newnode;
        else {
            last->link = newnode;
            last = newnode;
        }
    }


private:
    ChainNode <Type> *first;
    ChainNode <Type> *last;
};

И это моя основная функция:

int main() {
    Stack <char> mystack(20);
    Chain <char> mychain;

    int const size = 20;
    char math_infix[size];
    int operators = 0;
    int operands = 0;
    int math_size = 0;

    cout << "Write the math equation: " << endl;
    cin >> math_infix;


    for (int i = 0; i < size; i++)
    {
        if (i % 2 != 0 and (math_infix[i] == '+' or math_infix[i] == '*')) {
            operators++;
        }
    }
    operands = operators + 1;
    math_size = operands + operators;

    mystack.Read(math_infix, math_size, mychain);
    //mystack.Print();

    return 0;

}

1 Ответ

4 голосов
/ 30 апреля 2020

Вам нужно предоставить конвертирующий конструктор в ChainNode для работы следующей строки в attach:

ChainNode<Type>* newnode = new ChainNode<Type> (k);

Вам необходимо добавить:

ChainNode(Type c) : character(c) {}

к вашему ChainNode Класс.

...