错误 C2106:“=”:尝试从函数更改值时,左操作数必须是左值

error C2106: '=': left operand must be l-value when trying to change value from function

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

我希望能够使用 queue1.front() = 3; 更改它。但是,我得到

lvalue required as left operand of assignment

编译时出错

Node class

template<class T> class Node 
{
public:
    Node(const T& t);
    Node(const Node&) = default; // Copy Constructor set to default
    Node& operator=(const Node&) = default; // Assignment operator set to default

    T getData();
private:
    T m_data;
    Node* m_nextNode;
};

template<class T> Node<T>::Node(const T& t) 
{
    this->m_data = t;
    this->m_nextNode = nullptr;
}

template<class T> T Node<T>::getData()
{
    return this->m_data;
}

Queue class

template<class T> class Queue 
{
public:
    static const int DEFAULT_FIRST_INDEX = 0;
    static const int SIZE_EMPTY = 0;
    Queue();
    Queue(const Queue&) = default; // Copy Constructor set to default
    Queue& operator=(const Queue&) = default; // Assignment operator set to default
    T front();
private:
    Node<T>* m_head;
    Node<T>* m_tail;
    int m_size;
};

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

成员函数

T Node::getData() ...
T Queue<T>::front() ...

正在返回成员 m_data 的副本,这是一个 r-value 临时成员。为了处理作业,您需要 non-const l-value reference 合格 T。因此,编译器错误。

因此,您需要进行以下修复:

template<class T> class Node 
{
public:
    T& getData()
//  ^^
    {
        return this->m_data;
    }
    const T& getData() const;  // you might also need
//  ^^^^^^^^^          ^^^^^
};

template<class T> class Queue
{
public:   
    T& front()
//  ^^
    {
        // ....
        return this->m_head->getData();
    }
    const T& front() const; // you might also need
//  ^^^^^^^^         ^^^^^
};