关于“STD::oSoS&”的非const引用初始化的一个C++编译器错误,它是一个临时的类型:“STD::OFSH”

关于“STD::oSoS&”的非const引用初始化的一个C++编译器错误,它是一个临时的类型:“STD::OFSH”,c++,ostream,C++,Ostream,我一直在尝试创建一个程序,该程序为一组已定义的进程实现实时调度算法。在使用g++编译时,我收到一个错误,该错误表示: RTSprocess.h:函数中的“std::ostream&operatorchange friend ostream& operator << (ostream &os, const rtsProcess &p) { p.display(os); return &os; }; 到 运算符&称为的地址。返回引用与返回

我一直在尝试创建一个程序,该程序为一组已定义的进程实现实时调度算法。在使用g++编译时,我收到一个错误,该错误表示:

RTSprocess.h:函数中的“std::ostream&operatorchange

friend ostream& operator << (ostream &os, const rtsProcess &p) {
    p.display(os);
    return &os;
};


运算符&称为的地址。返回引用与返回导致编译器错误的地址不同。

正如您在文章的第一条评论中指出的,不要这样做

return &os; // this creates a temporary pointer to os
照办

return os;
无论何时

&x
如果x是某个变量,则会得到指向该变量的临时指针。因此会出现错误消息

RTSprocess.h84:错误:从类型为“std::ostream*”的临时文件初始化类型为“std::ostream&”的非常量引用无效

#ifndef RTSPROCESS_H
#define RTSPROCESS_H
//defining the rts process


#include <iostream>
#include <vector>
#include <string>
//include the necessary parts

using namespace std;

//create the rts process class itself, declare all necessary variables
class rtsProcess {
protected:
public:
    int pid;
    int burst;
    int arrival;
    int timeRemaining;
    int doneWaiting;
    int finishTime;
    int deadline;
    bool failed;

    //assign base values to all necessary variables
    rtsProcess() {
        this->failed = false;
        this->pid = 0;
        this->burst = 0;
        this->arrival = 0;
        this->timeRemaining =0;
        this->doneWaiting = 0;
        this->finishTime = 0;
        this->deadline = 0;
    };

    //set case where variables assigned by user
    rtsProcess (int pid, int burst, int arrival, int deadline) {
        this->pid = pid;
        this->burst = burst;
        this->arrival = arrival;
        this->timeRemaining = burst;
        this->deadline = deadline;
        this->doneWaiting = 0;
        this->finishTime = 0;
        this->failed = false;
    };
    ~rtsProcess() {

    };
    //set case where input from file
    rtsProcess( const rtsProcess &p) {
        pid = p.pid;
        burst = p.burst;
        arrival = p.arrival;
        timeRemaining = p.timeRemaining;
        deadline = p.deadline;
        doneWaiting = p.doneWaiting;
        finishTime = p.finishTime;
        failed = p.failed;
    };
    // set with return
    rtsProcess& operator = (const rtsProcess &p) {
        pid = p.pid;
        burst = p.burst;
        arrival = p.arrival;
        timeRemaining = p.timeRemaining;
        deadline = p.deadline;
        doneWaiting = p.doneWaiting;
        finishTime = p.finishTime;
        failed = p.failed;
        return *this;
    };
    //set the operators
    bool operator== (const rtsProcess &p) {
        return (this->pid == p.pid && this->arrival == p.arrival && this->burst == p.burst);
    }
    bool operator!= (const rtsProcess &p){
        return !(this->pid == p.pid && this->arrival == p.arrival && this->burst == p.burst);
    }
    friend ostream& operator << (ostream &os, const rtsProcess &p) {
        p.display(os);
        return &os;
    };
    //set the display to the console
    void display(ostream &os) const {
        os << "\t" << pid;
        os << "\t" << burst;
        os << "\t" << arrival;
        os << "\t" << deadline;
        os << "\t\t" << timeRemaining;
    };
};
#endif

因此,编译器意识到,当函数返回引用并抛出错误时,您正试图返回指针。

参数os是一个引用。函数返回一个引用。您不需要在os之前使用。我说的是运算符谢谢,我不敢相信它是如此小和愚蠢,但它表明我需要大量投入C/C++编码。没有C/C++的东西。@ Kielnj.J.C++是野兽,你需要耐心,最终你会到达那里:好运伙伴!你不需要地址和操作符来返回引用。他不仅不需要它,而且他也不能拥有。@ JeSa,我的意思是,地址运算符与返回引用不同,虽然这是一个好的通知,但我将进行编辑:
return os;
&x