Сложность с шаблоном класса - PullRequest
0 голосов
/ 27 марта 2012

Хорошо, ребята, я пытался определить стек, каждый узел также имеет тип шаблона, но я получаю дюжину различных типов ошибок, когда программа пытается скомпилировать.я вставлю программу, которая использует стек типа char и пытается вывести букву 'e'

 #ifndef STACK_LIST_H
#define STACK_LIST_H
#include "List.h"

using namespace std;
template <class T>
class Stack {
public:
    T pop();
    void push(T x);
    T isEmpty();
    T top();

private:
    int      size;
    Node<T> *   headNode;
    Node<T> *   currentNode;


};

#endif

Теперь определения функций:

    #include <iostream>
#include "Stack_list.h"

using namespace std;
template <class T>
T Stack<T>::pop(){
    T x = headNode->get();
    Node<T>* p = new Node<T>::Node();
    p = headNode;
    headNode = headNode->getNext();
    delete p;
    return x; }

template <class T>
void Stack<T>::push(T x){
    Node<T>* newNode = new Node<T>::Node();
    newNode->setNext(headNode);
    newNode->set(x);
    headNode=newNode;
}

template <class T>
int Stack<T>::isEmpty(){
return (headNode ==NULL);}

template <class T>
T Stack<T>::top(){
return headNode->get();
}

теперь узел класса шаблона:

#ifndef LIST_H
#define LIST_H

using namespace std;

/* The Node class */
template <class T>
class   Node
{
    public:
        Node(T here){object=here;};
        T get() { return   object; };
        void  set(T object) { this->object   =   object; };
        Node<T>* getNext() { return   nextNode; };
        void  setNext(Node<T>* nextNode) { this->nextNode   =   nextNode; };
        Node<T>* getPrev(){ return  prevNode;};
        void  setPrev(Node<T>* prevNode){this->prevNode=prevNode;};
    private:
       T object;
       Node<T>* nextNode;
       Node<T>* prevNode;
};
#endif

и, наконец, программа, которая вызывает классы:

#include <iostream>
#include "Stack_list.cpp"
using namespace std;

int main(){
Stack <char>s;
s.push("e");
cout<<s.pop();
}

Как видите, это моя первая попытка шаблонных классов.В определениях Stack :: pop () и push (T) говорится «ожидаемый спецификатор типа перед Node»

Ответы [ 2 ]

1 голос
/ 27 марта 2012

Node<T>* newNode = new Node() несовместимо. Node это класс или шаблон класса? В первый раз, когда вы упоминаете об этом, вы рассматриваете его как шаблон и создаете его экземпляр с помощью T, но во второй раз вы рассматриваете его как класс. Это не может быть и то и другое.

1 голос
/ 27 марта 2012

Ваши сигнатуры определения метода:

T Stack<T>::pop()

, но они должны быть

template<typename T>
T Stack<T>::pop()

Кроме того, поскольку Stack использует Node, вы должны включить Node.h вStack.h.

Более того - в Stack вы объявили T isEmpty();, но реализовали его как int Stack<T>::isEmpty().Придерживайтесь одного типа возврата (вероятно, bool здесь более уместно, но int тоже в порядке).

Наконец:

Stack <char>s;
s.push("e");

Специализация шаблона - char, но"e" - это const char*.Правильный путь будет:

Stack <char>s;
s.push('e'); // <- note the single quotes
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...