【问题标题】:non-const lvalue reference to type '' cannot bind to a temporary of type ' *'对“”类型的非 const 左值引用不能绑定到“*”类型的临时对象
【发布时间】:2019-12-21 23:44:04
【问题描述】:

演示代码

在文件 A 中:

class Queuetest{
...
queue<myclass>* mMyQueue = new queue<myclass>;

void addMyclass(myclass& myclassobject){
    mMyQueue->push(myclassobject);
}
...
};

在文件 B 中:

...
Queuetest* mQueuetest = new Queuetest();

mQueuetest->addMyclass(new myclass(...));
...

所以编译告诉我:

对“myclass”类型的引用无法绑定到“myclass *”类型的右值

一些类似的案例给了我原因:

C++ 标准不允许将匿名临时绑定到引用,尽管一些编译器允许将其作为扩展。 (允许绑定到 const 引用。)

但是没有办法告诉我如何解决它;

我想使用队列来控制我的对象,并使对象像 FIFO 一样工作;添加新的,并弹出最后一个,自动释放该对象的内存;

有什么好办法吗?

【问题讨论】:

  • "addMyclass(myclass& myclassobject)" 想要获得引用,而 "mQueuetest->addMyclass(new myclass(...));"给出一个指向函数的指针。你应该决定你想要什么!如果你想用引用声明并有临时对象,那么你必须为 rvalue ref 添加一个接口来移动对象。
  • 原样的代码不需要任何指针。你真的应该摆脱它们。
  • 我敢打赌,您是一名 Java 程序员,出于习惯而试图将所有内容都放在一堆堆上。如果您想以正确的方式做事,请使用 Google 组合和完美转发。
  • @NathanOliver 那么有什么好方法可以实现我的目标吗?

标签: c++ class reference queue constants


【解决方案1】:

至少使用 const 限定符

void addMyclass( const myclass& myclassobject){
    mMyQueue->push(myclassobject);
}

或者像这样重载函数

void addMyclass(myclass&& myclassobject){
    mMyQueue->push(myclassobject);
}

而不是

mQueuetest->addMyclass(new myclass(...));

使用

mQueuetest->addMyclass(myclass(...));

因为队列被声明为存储myclass 类型的对象,而不是指向对象的指针。

queue<myclass>* mMyQueue = ...
      ^^^^^^^

还不清楚您为什么使用指向std::queue 的指针作为数据成员。

queue<myclass>* mMyQueue = new queue<myclass>;

只需像这样声明数据成员

queue<myclass> mMyQueue;

这是一个演示程序。

#include <iostream>
#include <queue>

struct myclass
{
};

class Queuetest
{
private:
    std::queue<myclass> mMyQueue;

public:
    void addMyclass( const myclass &myclassobject )
    {
        std::cout<< "void addMyclass( const myclass &myclassobject )\n";
        mMyQueue.push(myclassobject);
    }

    void addMyclass( myclass &&myclassobject )
    {
        std::cout<< "void addMyclass( myclass &&myclassobject )\n";
        mMyQueue.push(myclassobject);
    }
};

int main()
{
    Queuetest test;

    test.addMyclass( myclass() );

    myclass m;

    test.addMyclass( m );
}

它的输出是

oid addMyclass( myclass &&myclassobject )
void addMyclass( const myclass &myclassobject )

【讨论】:

  • 添加“const”显示:对“const myclass”类型的引用无法绑定到“myclass *”类型的右值
  • @iknow34languages const 引用可以绑定到右值。
  • 删除“新”显示:对“myclass”类型的非 const 左值引用无法绑定到“myclass”类型的临时对象
  • @Vlad 来自莫斯科 如果添加“const”并删除“new”仍然失败;
  • @iknow34languages 选择最佳答案关闭此问题,然后提出一个新问题,显示修改后的代码和错误消息。
【解决方案2】:

你给它的是一个指针而不是一个实例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-05
    • 1970-01-01
    • 1970-01-01
    • 2018-08-22
    • 2020-05-08
    • 2019-07-02
    • 2020-09-01
    • 1970-01-01
    相关资源
    最近更新 更多