重载ostream&时无效的转换错误运营商LT;<

时间:2011-10-08 15:49:37

标签: c++ operator-overloading

这是我的类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;操作

2 个答案:

答案 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;

在你的朋友功能中。