оператор перегрузки << для использования с ostream - PullRequest
1 голос
/ 22 сентября 2009

Я использую CPPUnit для проверки класса в моей программе. Этот класс (SCriterionVal) несколько уникален, потому что в нем есть операторы преобразования для многих типов (по сути, это класс значений динамического типа). Когда я компилирую контрольные примеры, которые тестируют его, используя CPPUNIT_ASSERT_EQUAL(), я получаю ошибки компиляции о "operator<< неоднозначно" из одного из заголовочных файлов CPPUnit. Похоже, что это экземпляр структуры assertion_traits с моим типом, и эта структура имеет метод toString(), который работает с использованием operator<< на OStringStream.

Я предполагаю, что это неоднозначно, а не ошибка из-за различных преобразований, доступных на SCriterionVal, некоторые из которых определили operator<< (например, встроенные типы). В попытке исправить эту ситуацию я создал функцию, не являющуюся членом, в заголовке для SCriterionVal с такой подписью:

ostream &operator<<(ostream &stream, SCriterionVal val);

Я подумал, потому что подпись должна быть точным совпадением, это разрешит неоднозначность. Нет такой удачи. Что я здесь не так делаю? Полагаю, я могу специализировать шаблон для assertion_traits для своего типа, но я надеялся, что смогу решить более общую проблему, заключающуюся в том, чтобы предоставить способ поместить мой класс в поток, а не просто удовлетворить тестовую среду.

1 Ответ

2 голосов
/ 22 сентября 2009

Попробуйте определить operator<< как встроенную функцию друга в определении класса. Я всегда считаю, что этот способ работает лучше всего, особенно для шаблонов.

Например, Boost.Random определяет operator<< внутри объявления exponential distribution:

  template<class CharT, class Traits>
  friend std::basic_ostream<CharT,Traits>&
  operator<<(std::basic_ostream<CharT,Traits>& os, const exponential_distribution& ed)
  {
    os << ed._lambda;
    return os;
  }
...