首页 文章

关于从类型'std :: ostream'的临时类型初始化'std::ostream&'类型的非const引用的C编译器错误

提问于
浏览
0

我一直在尝试创建一个程序,为一组定义的进程实现实时调度算法 . 使用g进行编译时出现错误,其中指出:

RTSprocess.h:在函数'std :: ostream&operator <<(std :: ostream&,const rtsProcess&)'中:RTSprocess.h84:错误:从一个临时的std :: ostream&'类型的非const引用无效初始化输入'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

从我可以看出,似乎错误在于这段代码(也是错误消息明确提到它):

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

我已经尝试了各种方法,我可以想到纠正错误,更改传递给p.display的类型不起作用,更改返回类型似乎不起作用,我有点在我的智慧结束 . 我在这里找到了引用相似内容的答案,但没有一个解决方案可以解决我的问题 . 任何帮助解决我的错误将不胜感激 .

2 回答

  • 5

    更改

    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;
    };
    

    运算符 & 被称为地址 . 返回引用不同于返回产生编译器错误的地址 .

  • 3

    正如你的帖子的第一条评论所指出的那样,不要这样做

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

    做就是了

    return os;
    

    无论何时你做

    &x
    

    其中x是某个变量,你得到一个指向该变量的临时指针 . 因此错误消息

    RTSprocess.h84:错误:从'std :: ostream *'类型的临时表中无效初始化'std :: ostream&'类型的非const引用

    因此编译器意识到,当函数返回引用时,您尝试返回指针,并且它会引发错误 .

相关问题