类型“”的非常量左值引用不能绑定到类型“ *”的临时对象

时间:2019-08-15 14:33:12

标签: c++ class reference queue const

演示代码

在文件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一样工作;添加一个新对象,然后弹出最后一个,自动释放该对象的内存;

有什么好方法吗?

2 个答案:

答案 0 :(得分:4)

至少使用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 )

答案 1 :(得分:3)

您正在将其传递给指针而不是实例。