2014-02-13 3 views
0

Я пытаюсь закодировать очередь на основе списка с шаблонами, но у меня странная ошибка, и я не знаю, что делать с ней. Я искал эту ошибку, но я не нашел ответов, которые были бы полезны для меня. Извините за мой английский. Спасибо за поддержку.c2955 - Использование шаблона класса reuires список аргументов. Queue

#include <iostream> 
#include <conio.h> 
using namespace std; 


template<class T> 

class Node{ 
public: 
    Node(T obj){value=obj; next=NULL;}; 
Node* next; 
T value; 
}; 

template<class T> 
class Queue{ 

    Node *top; 
    Node *bottom; 

public: 
    Queue(); 
    void push(T obj); 
    T pop(); 
    void print(); 
    ~Queue(){ if(next) delete next;}; 
    void delete_queue(); 




}; 

template<class T>Queue <T>::Queue(){ 
    top=bottom=NULL; 

} 




template<class T> void Queue <T>::push(T obj){ 

Node *newNode= new Node(obj); 

if(bottom) bottom->next = newNode; 
else { top=newNode; bottom=newNode;} 

} 




    template<class T> T Queue <T>::pop(){ 

if(top){ 
    Node * del = top; 
    T val = del-> value; 
    top=top->next; 
    delete del; 
    cout<<"popped "<<val; 
    return val; 
}else {cout<<"Error"; return 0;} 
    } 


void main(){ 
int n=0, p; 
char k; 
Queue<int> *a=new Queue<int>(); 
while(1){ 
cout<<"1.Push \n"; 
cout<<"2.Pop \n"; 

k=getch(); 
switch(k){ 
     case '1': 
      cout<<"Enter obj "<<endl; 
      cin>>p; 
      cout<<endl; 
      a->push(p); 

     break; 
     case '2': 
     a->pop(); 
     break; 

} 
} 
} 
+0

Вы получаете доступ к 'a', но он не был инициализирован. Это приведет к неопределенному поведению и, вероятно, к сбою. –

ответ

1

Вы должны указать аргументы шаблона при использовании шаблона

Например

class Queue{ 

    Node<T> *top; 
    Node<T> *bottom; 

или

template<class T> void Queue <T>::push(T obj){ 

Node<T> *newNode= new Node<T>(obj); 

Кроме того, если вы не определили имя null себя, то я думаю, вы имели в виду NULL или даже лучше использовать nullptr, если компилятор поддерживает это ключевое слово. В противном случае это заявление

top=bottom=null; 

недействителен.

Также функция main должна иметь тип возврата int.

int main() 

И не понятно, почему вы выделяете Queue класса в куче вместо того, чтобы просто определить его как локальный объект основной. Например

Queue<int> a; 
+0

Я исправил NULL; Но основная проблема заключалась в шаблонах. И это изменение (Node ) вызвало новые 100 + разные ошибки. – Sparksonet

+0

@ user3307591 Вы должны обновлять код везде, где используется тип шаблона. Смотрите мое обновленное сообщение –

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