2017-05-27 2 views
0

)みなさんこんにちは! 私はDoubleNode(二重リンクリストノードを表す)とDoublyLinkedList(それは実装です)という2つのクラスを持っています。 DoubleNodeクラスの中では、DoublyLinkedListはfriendクラスであると指定していますが、IDEとコンパイラはDoubleNodeクラス内でDoublyLinkedListクラスを再定義するのではなく、 "DoublyLinkedListのRedefinition 」などの記号の異なる種類の」ここ は私のコードです:リンクリストノードの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

ようこそスタックオーバーフロー。 [The Tour](http://stackoverflow.com/tour)を読み、[ヘルプセンター](http://stackoverflow.com/help/asking)の資料を参考にしてください。ここに聞いてください。 –

+0

πάνταῥεῖそれはここにあります。 DOの部分を検索するために@Swift THXの間にテキストがない場合は、ソースブロックを1つにまとめます。 – Swift

+0

@Swift THX –

答えて

0

コンパイラは、その特殊化を前方宣言する前に、DoublyLinkedListがクラステンプレートであることを知る必要があります。

ソリューション1.フォワード-宣言し、このようなclass DoubleNodeDoublyLinkedList:あなたが必要としない

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

注:

template <typename Type> 
class DoublyLinkedList; 

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

ソリューション2.friend宣言にtemplateを追加しますこの場合、Typeを繰り返してテンプレートのシャドウイングを避けるt。

+0

ああ!ありがとうございました )!あなたの答えは助けになりました! –

関連する問題