2017-12-02 42 views
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() 
{ 
} 

然後一些代碼來檢查是否正常工作

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

此代碼不希望編譯。我試圖尋找類似的項目或錯誤,並找不到有用的東西。因此,如果有人能夠解釋發生了什麼問題,那將是非常好的。 大部分錯誤都是一樣的。例如,不允許使用back()front(),因爲它們不是函數,也不是靜態成員。或者back()front()作爲類模板的成員不能接收類型的函數。希望有人能幫忙。

+4

「此代碼不想編譯」 - 請包含錯誤。另外 - 這是**遠**從*最小*示例 – Fureeish

+4

順便說一句 - 即使沒有錯誤,我可以看到,你有重複的聲明......在'私人'你有'節點 * front',這是一個指針,並且在'public'中有一個名爲'front'的方法。不能處理重載的重名,在這種情況下,你不是 – Fureeish

+1

這是一個雙向鏈表。當您將新節點插入到雙向鏈接列表中時,您有4個要更新的鏈接。你只更新2.另外,你的前面和後面的指針似乎從來沒有引用相同的鏈表。 –

回答

2

有和

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

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

之間的衝突,所以首先改變Node<Type>* front = NULL;Node<Type>* m_front = NULL;同樣以back。有你的代碼中的另一個錯誤,例如

Node<Type> temp = front; 

必須

Node<Type>* temp = front; 

最後,你可以看到一個沒有編譯錯誤的代碼上ideone

好幸運!