2013-03-29 3 views
0

다른 모든 오버로드 된 연산자가 작동 중입니다. 그러나 < <이 제대로 작동하는 데 문제가 있습니다. 3 : 0 :연산자 오버로딩 << 대기열 클래스 템플릿 내

Queue.h : 기능의 '표준 : ostream에 & 연산자 < < (성병 파일에서

을 포함 MAIN.CPP에서 :

컴파일러 말한다 : : ostream에 &, CONST 큐 &) '

Queue.h : 203 : 19 : 오류'currNode '는이 범위에서 선언되지

#include <iostream> 
#include <string> 
#include "Queue.h" 

using namespace std; 

int main() 
{ 

    Queue<string> q1; 
    Queue<int> q2; 

    string s = "Hello"; 
    int i = 3; 

    q1.pushBack(&s); 
    q2.pushBack(&i); 

    cout<<"contents of q1 = " << (*q1) << endl; 
    cout<<"contents of q2 = " << (*q2) << endl; 


    return 0; 
} 

여러분의 도움에 감사드립니다

Queue.h

#ifndef QUEUE_H 
#define QUEUE_H 
#include <string> 
#include <iostream> 

using namespace std; 

template <typename T> 

class Queue 
{ 
    template <typename V> 
    friend ostream& operator<<(ostream&, const Queue<V>&); 

    class Node 
    { 
    friend class Queue; 
    public: 
     T* data; 
     Node* next; 
    }; 

    public: 
    Queue(); 
    Queue(Queue<T>&); 
    ~Queue(); 
    void pushBack(T*); 
    void popFront(); 
    T front(); 
    bool empty(); 

    T* operator[](int);   
    Queue<T>& operator+=(T*);    
    Queue<T>& operator+=(Queue<T>&);  
    Queue<T> operator+(T*);    
    Queue<T> operator+(Queue<T>&); 
    Queue<T>& operator-=(T*);    
    Queue<T>& operator-=(Queue<T>&);  
    Queue<T> operator-(T*);    
    Queue<T> operator-(Queue<T>&);  
    Queue<T>& operator=(const Queue<T>&); 
    //Empty the queue 
    Queue<T> operator!();     


    private: 
    Node* head; 
}; 

//Constructor 
template <typename T> 
Queue<T>::Queue(): head(0) 
{ 
} 

template <typename T> 
Queue<T>::Queue(Queue<T>& copy) 
{ 
    head=0; 
    Node* currNode = copy.head; 
    Node* prevNode = 0; 
    Node* newNode; 

    while (currNode!=0){ 
    newNode = new Node(); 
    newNode->data = currNode->data; 
    if (prevNode!=0) prevNode->next = newNode; 
    if (head ==0) head = newNode; 
    prevNode=newNode; 
    currNode=currNode->next; 
    } 
} 

//Destructor 
template <typename T> 
Queue<T>::~Queue() 
{ 
    Node *currNode, *nextNode; 
    currNode = head; 
    while(currNode!=0){ 
    nextNode=currNode->next; 
    delete currNode; 
    currNode=nextNode; 
    } 
} 

//Adding to back 
template <typename T> 
void Queue<T>::pushBack(T *newData){ 
    Node *newNode = new Node; 
    newNode->data = newData; 
    newNode->next = 0; 


    //If empty 
    if (head==0){ 
    head = newNode; 
    return; 
    } 

    Node *currNode; 
    currNode = head; 
    while(currNode->next!=0) 
    currNode=currNode->next; 
    currNode->next = newNode; 
} 

//Removing from front 
template <typename T> 
void Queue<T>::popFront(){ 
    Node *oldNode; 
    oldNode = head; 

    head = oldNode->next; 
    delete oldNode; 
} 

//getFront 
template <typename T> 
T Queue<T>::front(){ 
    return *(head->data); 
} 

//Is it empty 
template <typename T> 
bool Queue<T>::empty(){ 
    if (head==0) 
    return true; 
    else 
    return false; 
} 

/*------------------------Overloaded Operators---------------------------*/ 

template <typename T> 
Queue<T>& Queue<T>::operator+=(Queue<T>& q) 
{ 

    Node *curr; 
    curr = q.head; 

    while(curr!=0) 
    { 
    this->pushBack(curr->data); 
    curr = curr->next; 
    } 

    return (*this); 
} 

template <typename T> 
Queue<T> Queue<T>::operator+(Queue<T>& q) 
{ 
    Queue<T> newQueue = *this; 

    newQueue+=q; 

    return newQueue; 
} 

template <typename T> 
Queue<T> Queue<T>::operator+(T *t) 
{ 

    Queue<T> tmp = *this; 

    if(t == 0) 
    return tmp; 

    tmp.pushBack(t); 
    return tmp; 
} 

template <typename T> 
Queue<T>& Queue<T>::operator+=(T *t) 
{ 
    if(t == 0) 
    return (*this); 

    this->pushBack(t); 
    return (*this); 
} 

template <typename T> 
Queue<T> Queue<T>::operator!() 
{ 
    if(this ==0) 
    return (*this); 

    Node *curr = head; 
    while(curr!=0) 
    { 
    curr = curr->next; 
    this->popFront(); 
    } 
    return (*this); 
} 

/*NOT WORKING?!?!*/ 
template <typename T> 
ostream& operator<<(ostream& output, const Queue<T>& q) 
{ 
    Queue<T>::Node *currNode; /******HERE IS THE PROBLEM******/ 
    currNode = q.head; 

    if(q.head == 0) 
    { 
    output << "Empty" << endl; 
    return output; 
    } 
    do { 
    output << *(currNode->data) << endl; 
    currNode = currNode->next; 
    } while (currNode != 0); 

    return output; 
} 


template <typename T> 
Queue<T>& Queue<T>::operator-=(T *t) 
{ 

    if(t == 0) 
    return (*this); 

    //REMOVE ELEMENT 
    Node *currNode, *prevNode; 
    currNode=head; 
    prevNode=0; 
    while (currNode != 0){ 
    if ((*currNode->data) == (*t)){ 
     if (prevNode == 0) 
     head = currNode->next; 
     else 
     prevNode->next = currNode->next; 
     delete currNode; 
     break; 
    } 
    prevNode=currNode; 
    currNode=currNode->next; 
    } 
    return (*this); 
} 

template <typename T> 
Queue<T>& Queue<T>::operator-=(Queue<T>& q) 
{ 
    //REMOVE ELEMENT 
    Node *currNode; 
    currNode=q.head; 
    while(currNode!=0) 
    { 
    (*this)-=currNode->data; 
    currNode=currNode->next; 
    } 
    return (*this); 
} 

template <typename T> 
Queue<T> Queue<T>::operator-(T *t) 
{ 
    //REMOVE ELEMENT 
    Queue<T> newQueue = *(this); 
    newQueue-=t; 
    return newQueue; 
} 

template <typename T> 
Queue<T> Queue<T>::operator-(Queue<T>& q) 
{ 
    //REMOVE ELEMENT 
    Queue<T> newQueue= *(this); 
    newQueue-=q; 
    return newQueue; 
} 

template <typename T> 
Queue<T>& Queue<T>::operator=(const Queue<T>& copy) 
{ 
    head=0; 
    Node* currNode = copy.head; 
    Node* prevNode = 0; 
    Node* newNode; 

    while (currNode!=0){ 
    newNode = new Node(); 
    newNode->data = currNode->data; 
    if (prevNode!=0) prevNode->next = newNode; 
    if (head ==0) head = newNode; 
    prevNode=newNode; 
    currNode=currNode->next; 
    } 
    return (*this); 
} 

template <typename T> 
T* Queue<T>::operator[](int index) 
{ 
    Node *currNode; 
    currNode=head; 
    int i=0; 

    while(currNode!=0){ 
    if(index==i++) 
     return currNode->data; 
    currNode=currNode->next; 
    } 

    return 0; 
} 

#endif 

MAIN.CPP : 여기

내 코드입니다!

+0

당신이 컴파일러를 사용합니까 typename Queue< T >::Node을 통해, 당신은 큐 :: 노드는 유형입니다 컴파일러에게 필요가있다? –

+0

나는 g ++을 컴파일러로 사용하고있다. – VickiT05

+1

가능한 중복 [어디서 왜 "템플릿"과 "typename"키워드를 넣어야합니까?] (http://stackoverflow.com/questions/610245/where-and- 왜 - 할 - 템플릿 - 및 - typename - 키워드 넣어) – hmjd

답변

0

은 내가보기 엔 당신이 hmjd에 의해 게시 된 링크를 읽을 것을 권장하지만, 문제의 요점은

관련 문제