Я использую CPPUnit для проверки класса в моей программе. Этот класс (SCriterionVal
) несколько уникален, потому что в нем есть операторы преобразования для многих типов (по сути, это класс значений динамического типа). Когда я компилирую контрольные примеры, которые тестируют его, используя CPPUNIT_ASSERT_EQUAL()
, я получаю ошибки компиляции о "operator<<
неоднозначно" из одного из заголовочных файлов CPPUnit. Похоже, что это экземпляр структуры assertion_traits
с моим типом, и эта структура имеет метод toString()
, который работает с использованием operator<<
на OStringStream
.
Я предполагаю, что это неоднозначно, а не ошибка из-за различных преобразований, доступных на SCriterionVal
, некоторые из которых определили operator<<
(например, встроенные типы). В попытке исправить эту ситуацию я создал функцию, не являющуюся членом, в заголовке для SCriterionVal
с такой подписью:
ostream &operator<<(ostream &stream, SCriterionVal val);
Я подумал, потому что подпись должна быть точным совпадением, это разрешит неоднозначность. Нет такой удачи. Что я здесь не так делаю? Полагаю, я могу специализировать шаблон для assertion_traits
для своего типа, но я надеялся, что смогу решить более общую проблему, заключающуюся в том, чтобы предоставить способ поместить мой класс в поток, а не просто удовлетворить тестовую среду.