2017-05-27 51 views
0

)大家好! 所以我有兩個類名爲DoubleNode(代表雙鏈表節點)和DoublyLinkedList(它的實現)。在DoubleNode類中,我指定DoublyLinkedList是它的朋友類,但IDE和編譯器認爲它好像是在DoubleNode類中重新定義DoublyLinkedList類而不是恢復它只是一個朋友類,並給出錯誤說「重新定義'DoublyLinkedList 「作爲不同的符號」 這裏是我的代碼:鏈接列表節點的C++朋友類

#ifndef DoubleNode_h 
#define DoubleNode_h 
using namespace std; 
#include "DoublyLinkedList.h" 

template <typename Type> 
class DoubleNode { 
private: 
    Type elem; 
    DoubleNode<Type>* next; 
    DoubleNode<Type>* prev; 
    friend class DoublyLinkedList<Type>; 

    public: 
    DoubleNode (Type const& e, DoubleNode* a, DoubleNode* b) { 
     elem = e; 
     next = a; 
     prev = b; 
    } 

    Type getData() const { 
     return elem; 
    } 

    DoubleNode * getNext() const { 
     return next; 
    } 

    DoubleNode * getPrevious() const { 
     return prev; 
    } 


}; 

DoublyLinkedList.h

#ifndef DoublyLinkedList_h 
#define DoublyLinkedList_h 
#include "DoubleNode.h" 


template <typename Type> 
class DoublyLinkedList { 
private: 
    DoubleNode<Type>* head; 
    DoubleNode<Type>* tail; 
    int size; 

public: 
    DoublyLinkedList() { 
     head = new DoubleNode<Type>; 
     tail = new DoubleNode<Type>; 
     head->next = tail; 
     tail->prev = head; 
     head->prev = nullptr; 
     tail->next = nullptr; 

     size = 0; 
    } 

    ~DoublyLinkedList() { 
     while (!empty()) 
      pop_front(); 
     delete head; 
     delete tail; 
    } 

    //Accessors 
    int size() const{ 
     return size; 
    } 
    ... 

一個再次,編譯器給錯誤‘的重新定義‘DoublyLinkedList’作爲不同的符號’

+1

歡迎來到Stack Overflow。請花些時間閱讀[The Tour](http://stackoverflow.com/tour),並參閱[幫助中心](http://stackoverflow.com/help/asking)中的資料,瞭解您可以在這裏問。 –

+0

πάνταῥεῖ它在這裏。如果在 – Swift

+0

@Swift THX之間沒有任何文字,SO就會將源文件塊合併到一起,以便找到該文件。 –

回答

0

編譯器需要知道DoublyLinkedList是一個類模板,然後才能轉發它的專業化。

template <typename Type> 
class DoublyLinkedList; 

template <typename Type> 
class DoubleNode { 
private: 
    . . . 
    friend class DoublyLinkedList<Type>; 
    . . . 

解決方案2.添加templatefriend聲明:

template <typename Type> 
class DoubleNode { 
private: 
    . . . 
    template<typename> friend class DoublyLinkedList; 
    . . . 

注意你不需要

解決方法1.class DoubleNode這樣的前前向申報DoublyLinkedList在這種情況下重複Type以避免模板論證的陰影噸。

+0

啊!謝謝 )!你的答案有幫助! –