类型“int”的值不能分配给类型“Node<int> *”C/C++(513) 的实体

Kar*_*ide 1 c++ templates class class-template c++11

我有一个链表,其中包含指向第一个和最后一个节点的指针以及指示列表中有多少个节点的大小。\n我有一个返回第一个节点的函数。

\n

我希望能够使用 更改第一个节点中的 m_data queue1.front() = 3;。然而,我得到

\n
invalid conversion from \xe2\x80\x98int\xe2\x80\x99 to \xe2\x80\x98Node<int>*\xe2\x80\x99\n
Run Code Online (Sandbox Code Playgroud)\n

编译时出错

\n
invalid conversion from \xe2\x80\x98int\xe2\x80\x99 to \xe2\x80\x98Node<int>*\xe2\x80\x99\n
Run Code Online (Sandbox Code Playgroud)\n
template <class T>\nclass Node {\npublic:\n    Node(const T& t);\n    ~Node() = default;            // Destructor\n    Node(const Node&) = default;  // Copy Constructor set to default\n    Node& operator=(const Node&) =\n        default;  // Assignment operator set to default\n    T& getData();\n    const T& getData() const;\n    Node* getNext();\n    void setNext(Node<T>* newNext);\n\nprivate:\n    T m_data;\n    Node* m_nextNode;\n};\n\ntemplate <class T>\nNode<T>::Node(const T& t) {\n    this->m_data = t;\n    this->m_nextNode = nullptr;\n}\n
Run Code Online (Sandbox Code Playgroud)\n
template <class T>\nclass Queue {\npublic:\n    static const int SIZE_EMPTY = 0;\n    Queue();\n    ~Queue();                       // Destructor\n    Queue(const Queue&) = default;  // Copy Constructor set to default\n    Queue& operator=(const Queue&) =\n        default;  // Assignment operator set to default\n    void pushBack(const T& t);\n    Node<T>*& front();\n    const Node<T>*& front() const;\n    void popFront();\n    int size() const;\n    class EmptyQueue {};\n\nprivate:\n    Node<T>* m_head;\n    Node<T>* m_tail;\n    int m_size;\n};\n\ntemplate <class T>\nNode<T>*& Queue<T>::front() {\n    if (this->m_size == Queue<T>::SIZE_EMPTY) {\n        throw Queue<T>::EmptyQueue();\n    }\n    return this->m_head;\n}\n\ntemplate <class T>\nvoid Queue<T>::pushBack(const T& t) {\n    this->m_size += 1;\n    Node<T>* newNode = new Node<T>(t);\n    this->m_tail = newNode;\n    if (this->m_size == 1) {\n        this->m_head = newNode;\n    } else {\n        Node<T>* tempNode = this->m_head;\n        while (tempNode->getNext()) {\n            tempNode = tempNode->getNext();\n        }\n        tempNode->setNext(newNode);\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

Ted*_*gmo 5

Queue<T>::front()Node<T>*&在应该返回 a 的时候却返回了 a T&

例子:

template <class T>
T& Queue<T>::front() {
    if (this->m_size == Queue<T>::SIZE_EMPTY) {
        throw Queue<T>::EmptyQueue();
    }
    return m_head->getData();
}

template <class T>
const T& Queue<T>::front() const {
    if (this->m_size == Queue<T>::SIZE_EMPTY) {
        throw Queue<T>::EmptyQueue();
    }
    return m_head->getData();
}
Run Code Online (Sandbox Code Playgroud)

您还需要在类定义中进行相同的更改:

template <class T>
class Queue {
public:
    //...
    T& front();
    const T& front() const;
    //...
};
Run Code Online (Sandbox Code Playgroud)

  • @KareemAraide 对于前面的迭代器,该成员通常称为“begin()”。也许,您可以稍后将“front()”基于“begin()”(以减少代码重复)。我认为 `front()` 不应该暴露实际上应该是内部的东西。 (3认同)