关于运算符<声明为类的友元函数,报错的问题,(急。。。)

归零起步 2018-08-31 09:54:43
// sales.h
#ifndef SALES_H
#define SALES_H

#include <string>
#include <istream>
#include <ostream>

class Sales
{
friend std::istream& operator>>(std::istream& is, Sales &sal);
friend std::ostream& operator<<(std::ostream& os, const Sales &sal);
friend bool operator<(const Sales &lsal, const Sales &rsal);
friend bool operator==(const Sales &lsal, const Sales &rsal);
friend bool operator!=(const Sales &lsal, const Sales &rsal);
int compare2(const Sales &lsal, const Sales &rsal);

public:
Sales() = default;
Sales(std::string name) : bkName(name) {}
Sales(std::istream is) { is >> *this; }

public:
Sales& operator+=(const Sales& sal);
std::string isbn() const { return bkName; }
double avg() const;

private:
std::string bkName;
size_t bkCount = 0;
double bkRevenue = 0.0;
};

#endif // SALES_H



//sales.cpp
#include "sales.h"

#include <istream>
#include <ostream>
#include <string>

std::istream& operator>>(std::istream& is, Sales &sal)
{
double price = 0;
is >> sal.bkName >> sal.bkCount >> price;
if (is)
{
sal.bkRevenue = sal.bkCount * price;
}
else
{
sal = Sales();
}

return is;
}

std::ostream& operator<<(std::ostream& os, const Sales &sal)
{
os << sal.bkName << sal.bkCount << sal.bkRevenue;
os << '\n';
return os;
}

bool operator<(const Sales &lsal, const Sales &rsal)
{
return compare2(lsal, rsal) == 1? true : false;
}

bool operator==(const Sales &lsal, const Sales &rsal)
{
return ((lsal.isbn() == rsal.isbn()) && (lsal.bkCount == rsal.bkCount) && (lsal.bkRevenue == rsal.bkRevenue));
}

bool operator!=(const Sales &lsal, const Sales &rsal)
{
return !(lsal == rsal);
}

int Sales::compare2(const Sales &lsal, const Sales &rsal)
{
if ( lsal.isbn() > rsal.isbn() )
{
return 1;
}
else if ( lsal.isbn() == rsal.isbn() )
{
return 0;
}
else
{
return -1;
}
}

Sales& Sales::operator+=(const Sales &sal)
{
this->bkCount += sal.bkCount;
this->bkRevenue += sal.bkRevenue;
return *this;
}

double Sales::avg() const
{
if ( bkCount != 0 )
{
return this->bkRevenue / this->bkCount;
}
else
{
return 0;
}
}


问题: 编译时报错 error: ‘compare2’ was not declared in this scope 为什么报错?
...全文
128 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
srhouyu 2018-08-31
  • 打赏
  • 举报
回复
友元函数里面并没有this指针,不知道要调哪里的compare2。

你的compare2要么写成static的,这样调:
Sales::compare2(lsal, rsal);



要么这样:

Sales useless;
useless.compare2(lsal, rsal);


当然推荐前者。
stecdeng 2018-08-31
  • 打赏
  • 举报
回复
哦 有设置=== 看漏了
但是一个是Sales内的 Sales::compare2
一个是直接调用 compare2函数
这个是有区别的
stecdeng 2018-08-31
  • 打赏
  • 举报
回复
一个返回bool 一个返回int

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧