2012-03-26 3 views
0

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

#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 :: поп() и толчке (T) он говорит,

+1

Может быть, начать с чего-то более простого? –

+0

Каковы ошибки? Какое определение в первую очередь относится к тому, что включено? Как вы ожидаете от нас помощи, просто набросив код на нас? – littleadv

+0

проверить код Я его обновил и попытался быть более ясным в своем вопросе –

ответ

1

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

+0

его шаблон класса, не умеет рисовать правой рукой этой операции присваивания, я должен включить Node * newNode = новый Node :: Node()? –

+0

Nope; имя созданного типа - 'Node ', и это все, что вам нужно для нового: 'Node * newNode = new Node '. Да, с C++ 03 вы должны повториться.В C++ 11 это просто 'auto newNode = новый Node '. – MSalters

+0

Ничего себе, что сработало! поэтому я должен упомянуть тип при вызове конструктора .. большое спасибо –

1

Ваши подписи определение метода "ожидаемого типа-спецификатор, прежде чем 'узел'" являются:

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 
+0

выполнил все это, но у него возникли проблемы с спецификацией типа NODE, я обновил код и вставил его выше, включил Node , когда новый тип-узел создается –

Смежные вопросы