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