Ostream & operator << код перегрузки не работает - PullRequest
1 голос
/ 23 ноября 2011
#include <string>
#include <iostream>

template <typename T>
T max(T a, T b) {
    return a > b ? a : b;
}

class Dummy {
  private:
    std::string name;
    int age;
  public:
    Dummy(int an_age) {age = an_age;}
    bool operator> (Dummy &a) {return age > a.age;}
    std::string toString() const {return "The age is " + age;}
};

std::ostream& operator<<(std::ostream& out, const Dummy& d) {return out<< d.toString();}

int main()
{

  std::cout << max(3, 7) << std::endl;

  std::cout << max(3.0, 7.0) << std::endl;

  std::cout << max<int>(3, 7.0) << std::endl;

  std::cout << max("hello", "hi") << std::endl;

  Dummy d1(10);
  Dummy d2(20);
  std::cout << max(&d1, &d2) << std::endl;

  return 0;
}

Я довольно новичок в C ++, но не новичок в программировании. Я написал код для игры с перегрузкой шаблонов и операторов в C ++.

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

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

  2. Мне удалось заставить его скомпилировать методом проб и ошибок, поэтому я подозреваю, что код может быть в некоторой степени нарушен. И я могу не знать, что будет улучшено.

Ответы [ 3 ]

6 голосов
/ 23 ноября 2011

Ваше выражение max(&d1,&d2) дает вам адрес , и это распечатывается. Перегрузка вашего оператора в порядке.

3 голосов
/ 23 ноября 2011

Я предполагаю, что линия, о которой вы говорите, -

std::cout << max(&d1, &d2) << std::endl;

Проблема в том, что вы передаете Dummy * вместо Dummy.Это заставляет max вернуть Dummy *, и, поскольку ваш перегруженный operator<< принимает (по существу) Dummy, он не вызывается.Если вы пытаетесь передать по ссылке, вам не нужно делать ничего особенного на стороне вызывающей стороны, просто заставьте функцию взять ссылку, и компилятор выяснит это.

2 голосов
/ 23 ноября 2011
  1. Не пишите свой собственный max, используйте вместо него стандартный:

    #include <algorithm>
    void f() { int a = std::max(8, 4); }
    

    Единственное отличие состоит в том, что стандарт max использует operator < по умолчанию, как и все остальное в стандартной библиотеке.

  2. Ваша функция toString делает что-то отличное от того, что вы думаете. Вместо этого он возвращает подстроку "The age is ", начинающуюся с символа age. Например, если age равно 3, toString вернет " age is ". Чтобы преобразовать целое число в строку, вы должны использовать ostringstream:

    std::string toString() const { 
        std::ostringstream s;
        s << "The age is " << age; 
        return s.str();
    }
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...