2015-12-22 53 views
0

我想第一次实现LinkedList。我几乎完成了头文件的声明,但是我得到了一个不会消失的小错误。在Node类下面声明类LinkedList和Iterator的地方,我总是收到一条消息“LinkedList重新定义为不同类型的符号”和“重新定义Iterator作为不同类型的符号”。我试着在下面的代码的顶部声明类,将朋友函数移动到私有声明中,但似乎没有任何效果。有人能指出我做错了什么吗?除了下面的内容,我还没有做过其他的事情。请链接列表声明?

class LinkedList; 
class Iterator; 


template <typename T> 
class Node{ 
public: 
    Node(T Data); 


private: 
    T data; 
    Node* next; 
    Node* previous; 
    friend class LinkedList; 
    friend class Iterator; 
}; 

template<typename T> 
class LinkedList { 
public: 
    LinkedList(); 
    void pushback(T data); 
    //void insert(Iterator pos, T data); 
    ~LinkedList(); 
    //Iterator begin(); 
    //Iterator end(); 

private: 
    Node* first; 
    Node* last; 
    friend class Iterator; 
}; 

template <typename T> 
class Iterator{ 
public: 

private: 
    Node* position; 
    LinkedList* container; 
    friend class LinkedList; 
}; 

#endif /* defined(__Linked_List_1__LinkedList__) */ 

回答

0

您正转发声明LinkedList为非模板。更新它看起来像:

template<typename T> class LinkedList; 

并做相同的Iterator

1

您首先将LinkedList声明为一个类,然后将LinkedList定义为类模板。你应该申报名称作为类模板马上(同样适用于其他声明):

template <typename> class LinkedList; 

当指的相应的类模板,例如在friend申报Node你要么需要做类模板的朋友,例如,使用

template <class S> friend class LinkedList; 

...或者,也许,最好做出相应的实例化一个朋友:

friend class LinkedList<T>; 
+0

谢谢。这解决了第一个问题,但是我所有的朋友的其他声明现在都说“精心制作的类型是指模板”。关于我该怎么做的任何想法? –

+0

其实我找到它只是语法谢谢 –

0

当您实现LinkedList模板类时,应该将typename T转发到Node类的声明中,因为Node是模板,并且需要指定类型名称来扩展特定类型的代码。

我的解决方法是使用嵌套类来解决一些复杂的依赖性问题,并为你做的转发。(如A类含有B类,B类包含A型)

namespace test{ 
    template<typename T> class Iterator; 

    template<typename T> 
    class LinkedList { 
    public: 
    LinkedList(); 
    void pushback(T& data); 
    void insert(Iterator<T> pos, T& data); 
    ~LinkedList(); 
    Iterator<T> begin(); 
    Iterator<T> end(); 
    private: 

    struct Node{ 
     T data; 
     Node* next; 
     Node* prev; 
    }; //Node should be expose to others, try not to complicate friendship 

    Node* first; 
    }; 

    template<typename T> class Iterator{ 
    public: 
    T& operator*() const; 
    T* operator->() const; 
    Iterator<T> next(); 
    private: 
    struct Node{ 
     T data; 
     Node* next; 
     Node* prev; 
    }; 
    Node* position; 
    LinkedList<T>* container; 
    friend class LinkedList<T>; 
    }; 
} 

上面的代码显示了如何使用嵌套类(或结构体,基本上struct是一个类)。您不会将您的节点暴露给用户,并且迭代器应该是类的指针。我更喜欢重载operator *和 - >。

使用嵌套类是一件好事,因为很容易将类移出然后移入。当您认为可以使用嵌套类时,应该尝试。