Недопустимая ошибка преобразования при перегрузке ostream & operator << - PullRequest
0 голосов
/ 08 октября 2011

Вот прототип моего класса 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

А это реализация перегруженного оператора вывода << в рациональном.cpp </p>

// 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]

Я хотел бы иметь возможность отображать рациональное число в качестве числителя / знаменателя, когда оно передается оператору <<. </p>

Ответы [ 2 ]

4 голосов
/ 08 октября 2011

Ваша первая проблема заключается в том, что вы пытаетесь переслать объявление ostream как класса. Предполагая, что вы хотите использовать std::ostream, вы не можете этого сделать, это не разрешено законом.

Например, typedef для специализации шаблона, а не сам класс.

Во-вторых, поскольку у вас нет #include <ostream>, у вас нет определения для любой из стандартных << перегрузок для ostream, поэтому при попытке << строкового литерала компилятор пытается преобразовать строковый литерал типа Rational, так как это единственный тип с видимой перегрузкой <<.

Проще говоря, вам нужно #include <ostream> и квалифицировать ostream с std:: там, где вы его используете.

Третий момент заключается в том, что ваша перегрузка operator<< должна что-то вернуть. Вы должны либо добавить оператор return os;, либо просто return целое потоковое выражение.

1 голос
/ 08 октября 2011

Хотя я не уверен, почему вы получаете такое сообщение об ошибке, я обнаружил ошибку: вы должны добавить:

return os;

в функцию вашего друга.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...