Компилятор C ++ имеет противоречивые жалобы на перегрузку оператора <<

0

Кстати, я использую eclipse и g++ в arch linux (я запускал pacman -Syu меньше недели назад, поэтому все в актуальном состоянии).

Eclipse производит ошибку каждый раз, когда я пытаюсь скомпилировать это:

#ifndef DATE_HPP_
#define DATE_HPP_

using namespace std;

class Date {
public:
    int Year;
    char Month;
    char Day;
    char HH;
    char MM;
    char ss;
    Date();

    /*
     * Overloaded Operator Functions
     */
    //Assignments
    Date operator=(Date input);
    //Comparisons
    bool operator==(Date& rhs);
    bool operator!=(Date& rhs);
    bool operator<(Date& rhs);
    bool operator>(Date& rhs);
    bool operator<=(Date& rhs);
    bool operator>=(Date& rhs);
    //Conversion
    operator char*();
    operator std::string();
    ostream& operator<<(ostream& os, const Date& date); //TROUBLE LINE
};

#endif /* DATE_HPP_ */

Eclipse показывает сообщение оператора << объявления, в котором говорится, что он должен иметь только один аргумент. Тем не менее, когда я заявляю следующее:

ostream& operator<<(const Date& date);

Он жалуется, что у него должно быть два. Что я делаю не так?

Теги:
operator-overloading
iostream

2 ответа

4
Лучший ответ

Перегрузка с двумя аргументами оператора должна быть функцией, не являющейся членом. Либо выведите его из определения класса, либо добавьте к нему friend чтобы сделать его функцией, не являющейся членом, в зависимости от того, что имеет больше смысла.

Перегрузка с одним аргументом не полезна, так как она используется, когда экземпляр объекта является левым операндом.

  • 0
    Итак, вы бы порекомендовали сделать его частью заголовочного файла? Я не знал, что есть два способа перегрузить функцию. Я гуглил несколько хороших примеров << перегрузки, но мне еще предстоит найти что-нибудь, что я мог бы заставить работать. Есть ли у вас ссылки, которыми вы могли бы поделиться?
  • 0
    @ KG6ZVP: где вы положили определение зависит от вас; только объявление должно быть в заголовке. Это один из наиболее часто задаваемых вопросов, поэтому мне трудно поверить, что вы не смогли найти никакой информации.
Показать ещё 1 комментарий
0

friend ostream& operator<<(ostream& os, const Date& date);

Также вы можете добавить некоторые константы в свой код. Например..

bool operator==(const Date& rhs) const;

Я также предлагаю вам сделать все целые int, даже если они будут принимать только небольшое значение (например, месяц), если нет технической причины, по которой вам нужно, чтобы они были символами.

  • 0
    Я просто максимально оптимизировал пространство для хранения, так как я буду создавать много его экземпляров (несколько сотен и более), и к ним не будут обращаться достаточно часто, если потребуется дополнительное время для преобразования в int в материю.
  • 0
    @ KG6ZVP 1000 экземпляров сэкономит вам только 14 КБ.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню