【问题标题】:C++ friend class for linked list node [duplicate]链表节点的C ++朋友类[重复]
【发布时间】:2017-05-27 07:39:22
【问题描述】:

) 大家好! 所以我有两个名为 DoubleNode (代表双链表节点)和 DoublyLinkedList (它的实现)的类。在 DoubleNode 类中,我指定 DoublyLinkedList 将是它的朋友类,但是 IDE 和编译器认为它好像我在 DoubleNode 类中重新定义了 DoublyLinkedList 类,而不是恢复它只是一个朋友类并给出错误说“重新定义'DoublyLinkedList ' 作为不同的符号" 这是我的代码:

 #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;
    }


};

双链表.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'重新定义为不同类型的符号”

【问题讨论】:

  • 欢迎来到 Stack Overflow。请花时间阅读The Tour 并参考Help Center 中的材料,您可以在这里问什么以及如何问。
  • πάντα ῥεῖ 它就在这里。如果之间没有文本,则 SO 将源块合二为一
  • @Swift THX 寻找骗子。

标签: c++ xcode templates friend


【解决方案1】:

编译器需要知道DoublyLinkedList 是一个类模板,然后才能前向声明它的特化。

解决方案 1. 像这样在 class DoubleNode 之前声明 DoublyLinkedList:

template <typename Type>
class DoublyLinkedList;

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

解决方案 2. 将 template 添加到 friend 声明中:

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

请注意,在这种情况下,您无需重复 Type 以避免遮蔽模板参数。

【讨论】:

  • 啊!谢谢 )!你的回答有帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-13
  • 1970-01-01
  • 2010-09-19
  • 2010-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多