坤坤宝贝仔 2015-02-06 07:27 采纳率: 0%
浏览 644

errorC2679操作符重载

RT自己写了一个TIME类和SMSDATA类
“Time.h”声明如下
#ifndef _TIME_H
#define _TIME_H

#include

using namespace std;

class TIME
{
private:
int hour;
int min;
int sec;
public:
friend ofstream& operator<< (ofstream& out, const TIME& time);
friend ifstream& operator>> (ifstream& in, TIME& time);
};

#endif
"TIME.cpp”如下
#include "TIME.H"
#include

using namespace std;

istream& operator>> (istream& in, TIME& time)
{
in >> time.hour;
in >> time.min;
in >> time.sec;
return in;
}

ostream& operator<< (ostream& out, const TIME& time)
{
out << time.hour << ':' << time.min << ':' << time.sec;
return out;
}
SMSDATA.h如下:
#ifndef _SMSDATA_H
#define _SMSDATA_H

#include "TIME.H"
//#include
#include

using namespace std;

class SMSDATA
{
private:
unsigned int day_id;
string send_nbr;
string acpt_nbr;
int send_nbr_oprt;
int acpt_nbr_oprt;
TIME send_time;
public:
friend ostream& operator<< (ostream& out, const SMSDATA& smsdata);
friend istream& operator>> (istream& in, SMSDATA& smsdata);
};

#endif

“SMSDATA.cpp”如下:
#include "SMSDATA.H"
#include "TIME.H"
#include

using namespace std;

istream& operator>> (istream& in, SMSDATA& smsdata)
{
in >> smsdata.day_id >> smsdata.send_nbr >> smsdata.acpt_nbr

smsdata.send_nbr_oprt >> smsdata.acpt_nbr_oprt >> smsdata.send_time;
return in;
}

ostream& operator<< (ostream& out, const SMSDATA& smsdata)
{
out << smsdata.day_id << smsdata.send_nbr << smsdata.acpt_nbr
<< smsdata.send_nbr_oprt << smsdata.acpt_nbr_oprt << smsdata.send_time;
return out;
}
这里在SMSDATA.cpp中提示错误“errorC2679”就是没有找到接受“TIME”类型的右操作数的运算符(或没有可接受的转换)
这里我就不懂了啊,我明明重载了TIME的输入输出<< 和>>啊,为啥这里不对呢?
可是当我把SMSDATA.cpp中提示错误的地方屏蔽掉,在main函数中
TIME time;
cin>>time;
cout <<time;
这样就一定问题都没有而且能正确的运行,请问是什么问题呢???是我哪里的编译链接过程搞错了吗?还是怎样?求大侠指教啊!谢谢了!!!

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-08-03 09:23
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    你遇到的问题是因为你在尝试使用cin来读取一个SMSData对象。当你尝试将一个TIME对象赋值给一个SMSData对象时,cin无法正确地处理这种类型转换。

    解决这个问题的方法是在尝试进行类型转换之前先检查SMSData是否已经包含了TIME类型的成员。如果它包含这样的成员,则可以正常执行类型转换。

    如果你想要避免这种情况,你可以创建一个新的SMSData实例,并在初始化时自动设置send_timeTIME对象的引用。这样,cin就可以正确地读取SMSData并将其发送时间字段设置为TIME对象的引用。

    这是一个修改后的SMSData定义:

    #ifndef _SMSDATA_H
    #define _SMSDATA_H
    
    #include "TIME.H"
    #include <iostream>
    
    // 定义一个用于存储短信数据的数据结构
    class SMSData {
    public:
        // 保存短信ID
        unsigned int day_id;
        
        // 存储接收人手机号码
        string send_nbr;
        
        // 存储同意接收人的手机号码
        string acpt_nbr;
        
        // 存储发送短信的时间
        TIME send_time;
    
        // 创建一个SMSData对象
        SMSData() : day_id(), send_nbr(), acpt_nbr(), send_time() {}
    
        // 使用友好的流访问器
        friend std::ostream &operator<<(std::ostream &out, const SMSData &smsdata);
        friend std::istream &operator>>(std::istream &in, SMSData &smsdata);
    };
    
    // 使用友好的流访问器
    std::ostream &operator<<(std::ostream &out, const SMSData &smsdata) {
        out << smsdata.day_id << ":" << smsdata.send_nbr << ":" << smsdata.acpt_nbr << ":" << smsdata.send_time;
        return out;
    }
    
    std::istream &operator>>(std::istream &in, SMSData &smsdata) {
        in >> smsdata.day_id >> smsdata.send_nbr >> smsdata.acpt_nbr >> smsdata.send_time;
        return in;
    }
    #endif
    

    然后,在你的main()函数中,确保你有正确的类型转换:

    int main() {
        SMSData sms_data;
        TIME time; // 假设这是你的TIME对象
    
        cin >> sms_data; // 需要添加这个判断语句以防止错误
    
        cout << sms_data; // 输出短信数据
    }
    

    这应该解决了你的问题。

    评论

报告相同问题?