getNode():

    Node<type> getNode(int position) {
        Node<type> *item = head;
        for (int i = 0; i < position; ++i) {
            item = item->next;
        }
        return *item;
    };

节点交换代码:
        Node<Guitar*> temp;
        temp.element = list.getNode(l).element;
        temp.next = list.getNode(l).next;
        list.getNode(l).element = list.getNode(h).element;
        list.getNode(l).next = list.getNode(h).next;
        list.getNode(h).element = temp.element;
        list.getNode(h).next = temp.next;

我正在为我的计算机科学课设计一个项目,该项目将在几天之内完成。我想使用快速排序对链表进行排序,这很简单,但是在交换列表中的节点时,我一直在遇到一个奇怪的问题。作为引用,getNode()函数返回列表中某个索引处的节点,并且该节点持有指向吉他对象的指针以及下一个节点指针。我已经进行了几个小时的实验,发现类似这样的行“list.getNode(h).element = temp.element;”。就是说,指向列表中节点中吉他对象的指针已分配了temp对象中指针的值。这通常可以正常工作,但是此时我得到一个错误,说左侧不是可修改的左值。但是,我可以创建一个指针并将其放在赋值运算符的左侧,而不会出现任何错误。另外,当我在前面使用解引用运算符(*)时,左侧也没有错误,但这不会成功交换节点。我肯定错过了什么。

最佳答案

函数的返回类型应该是引用类型-否则,您要告诉编译器从要返回的值中复制构造一个对象,并将其用作返回值。

我写了一个示例,可以在here中找到它。为了简单起见,它构造了一个 vector 传递给geting函数,该 vector 返回一个取消引用的指针指向组件对象之一。如果您检查程序的输出,它会很高兴地通知您它正在复制构造该值,而不是对其进行引用-您对getNode函数“检索”到的节点所做的任何更改都将对节点进行从所需的节点复制构造。

我怀疑这也是为什么您试图将值分配给临时变量时,无法修改的左值出现问题的原因。

tl; dr:
您的getNode函数正在返回一个临时对象。使其返回引用。

关于c++ - 指针在Visual Studio 2013中被视为不可修改的左值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30226655/

10-11 22:59
查看更多