2017-12-02 1 views
0

최근 템플릿을 사용하여 속편을 구현하려고했습니다. 이템플릿으로 deque를 구현할 때의 문제

int main(){ 
    deque<int> qq(1); 
    qq.push_front(2); 
    qq.push_front(3); 
    qq.print_in_order(); 
    return 0; 
} 

를 작동하고이 코드는 컴파일하지 않는지 여기

#pragma once 
#include <iostream> 
using namespace std; 

template<typename Type> 
struct Node { 
    Node(); 
    Node<Type>* next = NULL; 
    Node<Type>* prev = NULL; 
    Type data; 
}; 

template<typename Type> 
class deque{ 
private: 
    Node<Type>* front = NULL; 
    Node<Type>* back = NULL; 

public: 
    deque(Type key); 
    ~deque(); 
    Node<Type>* back(); 
    Node<Type>* front(); 
    int size(); 
    bool empty(); 
    void push_front(Type key); 
    void push_back(Type key); 
    void pop_front(); 
    void pop_back(); 
    void print_in_order(); 
}; 


template<typename Type> 
    deque<Type>::deque(Type key) 
{ 
    if (front != NULL || back != NULL) 
     return 
    else 
    { 
     front = new Node<Type>(); 
     front->data = key; 
     prev = front; 
    } 
} 

template<typename Type> 
    deque<Type>::~deque() 
{ 
    Node<Type>* delPtr; 
    while (front->prev != NULL) 
    { 
     delPtr = front; 
     cout << "Deleted " << front->data<<endl; 
     front = front->prev; 
     delete delPtr; 

    } 
    back = NULL; 
    delete front; 
} 

template<typename Type> 
    Node<Type>* deque<Type>::back() 
{ 
     if(back!= NULL) 
     return back; 
    else 
      return NULL 
} 

template<class Type> 
    Node<Type>* deque<Type>::front() 
{ 
    return front; 
} 

template<typename Type> 
    int deque<Type>::size() 
{ 
    int counter = 0; 
    Node<Type>* temp = front; 
    while (temp->back != NULL) 
    { 
     counter++; 
     temp = temp->back; 
    } 
    return counter; 
} 

template<typename Type> 
    bool deque<Type>::empty() 
{ 
    if (front == NULL && back == NULL) 
     return true; 
    else 
     return false; 
} 

template<typename Type> 
    void deque<Type>::push_front(Type key) 
{ 
    Node<Type>* temp = new Node<Type>(); 
    temp->data = key; 
    temp->prev = front; 
    front->next = temp; 
    front = temp; 
} 

template<typename Type> 
    void deque<Type>::push_back(Type key) 
{ 
    Node<Type>* temp = new Node<Type>(); 
    temp->data = key; 
    temp->next = back; 
    back->prev = temp; 
    back = temp; 
} 

template<typename Type> 
inline void deque<Type>::pop_front() 
{ 
    if (front != NULL) { 
     Node<Type>* delPtr = front; 
     front = front->prev; 
     front->next = NULL; 
     delete delPtr; 
    } 
    else 
     cout << "There is no front in empty deque" << endl; 
} 

template<typename Type> 
    void deque<Type>::pop_back() 
{ 
    if (back != NULL) { 
     Node<Type>* delPtr = back; 
     back = back->next; 
     back->prev = NULL; 
     delete delPtr; 
    } 
    else 
     cout << "There is no back in empty deque " << endl; 
} 

template<typename Type> 
    void deque<Type>::print_in_order() 
{ 
    if (front == NULL) 
     return; 
    Node<Type> temp = front; 
    while (temp->prev != NULL) { 
     cout << temp->data << " "; 
     temp = temp->prev; 
    } 
    cout << endl; 
} 

template<typename Type> 
inline Node<Type>::Node() 
{ 
} 

그런 다음 몇 가지 코드를 확인하는 결과이다. 비슷한 프로젝트 나 버그를 찾는데 아무런 도움이되지 않았습니다. 그러므로 누군가가 잘못되어 가고있는 것을 설명 할 수 있다면 좋을 것입니다. 대부분의 오류는 같습니다. 예를 들어 back() 또는 front()은 정적 멤버가 아니기 때문에 함수가 아니기 때문에 사용할 수 없습니다. 또는 back()front() 클래스의 템플릿 구성원으로 함수 유형을받을 수 없습니다. 누군가가 도울 수 있기를 바랍니다.

+4

"이 코드는 컴파일하고 싶지 않습니다"- 오류를 포함하십시오. 또한 - 이것은 ** far ** Minimal * 예제입니다. – Fureeish

+4

Btw - 오류가 없어도 중복 된 선언을 볼 수 있습니다 ... 'private'에 포인터 인 Node * front가 있습니다. 'public'에는'front'라는 메서드가 있습니다. 오버로드를 다루지 않고 중복 된 이름을 가질 수는 없습니다.이 경우에는 그렇지 않습니다. – Fureeish

+1

이것은 이중 연결리스트입니다. 이중 링크 목록에 새 노드를 삽입하면 업데이트 할 수있는 링크가 4 개 있습니다. 또한 2를 업데이트하십시오. 또한 앞뒤 포인터는 같은 링크 된 목록을 참조하지 않는 것 같습니다. –

답변

2

그래서 처음 Node<Type>* m_front = NULL; 모든 변화 Node<Type>* front = NULL;

Node<Type>* front = NULL; 
Node<Type>* back = NULL; 

Node<Type>* back(); 
Node<Type>* front(); 

사이의 갈등과 back 동일한있다. 또 다른 오류가 마지막으로

Node<Type>* temp = front; 

해야 예를

Node<Type> temp = front; 

를 들어, 코드가있다, 당신은 ideone

좋은 행운에 컴파일 오류가없는 코드를 볼 수 있습니다!

관련 문제