对类型“”的非常量左值引用无法绑定到类型“*”的临时值

ikn*_*ges 3 c++ queue reference class constants

演示代码

在文件A中:

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

void addMyclass(myclass& myclassobject){
    mMyQueue->push(myclassobject);
}
...
};
Run Code Online (Sandbox Code Playgroud)

在文件B中:

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

mQueuetest->addMyclass(new myclass(...));
...
Run Code Online (Sandbox Code Playgroud)

所以编译告诉我:

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

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

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

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

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

有没有好的方法可以做到这一点?

Vla*_*cow 5

至少使用 const 限定符

void addMyclass( const myclass& myclassobject){
    mMyQueue->push(myclassobject);
}
Run Code Online (Sandbox Code Playgroud)

或者重载该函数,例如

void addMyclass(myclass&& myclassobject){
    mMyQueue->push(myclassobject);
}
Run Code Online (Sandbox Code Playgroud)

而不是

mQueuetest->addMyclass(new myclass(...));
Run Code Online (Sandbox Code Playgroud)

使用

mQueuetest->addMyclass(myclass(...));
Run Code Online (Sandbox Code Playgroud)

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

queue<myclass>* mMyQueue = ...
      ^^^^^^^
Run Code Online (Sandbox Code Playgroud)

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

queue<myclass>* mMyQueue = new queue<myclass>;
Run Code Online (Sandbox Code Playgroud)

只需声明数据成员即可

queue<myclass> mMyQueue;
Run Code Online (Sandbox Code Playgroud)

这是一个演示程序。

#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 );
}
Run Code Online (Sandbox Code Playgroud)

它的输出是

oid addMyclass( myclass &&myclassobject )
void addMyclass( const myclass &myclassobject )
Run Code Online (Sandbox Code Playgroud)