这是我的类Rational
的原型#ifndef RATIONAL_H
#define RATIONAL_H
//forward declaration
class ostream;
class Rational
{
int numerator,denominator;
public:
// the various constructors
Rational();
Rational(int);
Rational(int,int);
//member functions
int get_numerator()const{return numerator;}
int get_denominator()const{return denominator;}
// overloaded operators
// relational operators
bool operator==(const Rational&)const;
bool operator<(const Rational&)const;
bool operator<=(const Rational&)const;
bool operator>(const Rational&)const;
bool operator>=(const Rational&)const;
//arithmetic operators
Rational operator+(const Rational&)const;
Rational operator-(const Rational&)const;
Rational operator*(const Rational&)const;
Rational operator/(const Rational&)const;
//output operator
friend ostream& operator<<(ostream&, const Rational&);
};
#endif //RATIONAL_H
这是重载输出运算符的实现&lt;&lt;在rational.cpp中
// friend output operator
ostream& operator<<(ostream& os, const Rational& r)
{
os<<r.get_numerator()<<"/"<<r.get_denominator();
}
当我尝试编译时,我收到以下错误
g++ -c rational.cpp
rational.cpp: In function ‘ostream& operator<<(ostream&, const Rational&)’:
rational.cpp:81:26: error: invalid conversion from ‘const char*’ to ‘int’ [-fpermissive]
rational.cpp:7:1: error: initializing argument 1 of ‘Rational::Rational(int)’ [-fpermissive]
我希望能够将有理数显示为分子/分母,当它传递给&lt;&lt;操作
答案 0 :(得分:4)
您的第一个问题是您尝试将ostream
声明为一个类。假设您的意思是使用std::ostream
,则不能这样做,这不合法。
首先,它是模板专业化的typedef
,而不是类本身。
其次,因为您没有#include <ostream>
,因此您对<<
的任何标准ostream
重载都没有定义,所以当您尝试<<
时string literal,编译器尝试将字符串文字转换为Rational
类型,因为这是唯一可见<<
重载的类型。
简单地说,您需要#include <ostream>
并使ostream
使用std::
来限定operator<<
。
第三点是你return os;
的重载需要返回一些东西。您应该附加return
语句或仅{{1}}整个流表达式。
答案 1 :(得分:1)
虽然我不确定为什么会收到这样的错误消息,但我确实发现了一个错误:你应该添加:
return os;
在你的朋友功能中。