Существуют три способа, которые я определил для решения проблемы с operator<<
.
Первый способ - предоставить operator<<
для вашего типа. Это необходимо, потому что, когда boost_check_equal
сбой, он также регистрирует сбой, вызывая operator<<
с объектами. См. Подробное дополнение после перерыва, чтобы узнать, как это делается на самом деле. Это сложнее, чем может показаться.
Второй способ заключается в том, чтобы не делать записи, о которых я только что упомянул. Вы можете сделать это #definine
ing BOOST_TEST_DONT_PRINT_LOG_VALUE
. Чтобы отключить ведение журнала для только одного теста, вы можете окружить тест в вопросе с этим #define
, то сразу #undef
его:
#define BOOST_TEST_DONT_PRINT_LOG_VALUE
BOOST_CHECK_EQUAL (first, second);
#undef BOOST_TEST_DONT_PRINT_LOG_VALUE
Третий способ обойти необходимость в operator<<
, который работает с вашим типом, не сравнивая один пункт к другому, но только проверка bool:
BOOST_CHECK (first == second);
Выберите нужный метод.
Мое предпочтение - это первое, но осуществление, которое удивительно сложно. Если вы просто определяете operator<<
в глобальной области, это не сработает. Я думаю, причина в том, что проблема с разрешением имен. Одно популярное предложение исправить это - положить operator<<
в пространство имен std
. Это работает, по крайней мере, на некоторых компиляторах, но мне это не нравится, потому что стандарт запрещает добавлять что-либо в пространство имен std
.
Лучший метод, который я нашел, - это реализовать специальную специальную форму шаблона класса для вашего типа. print_log_value
- это шаблон шаблона useb для внутренних объектов Boost.Test, чтобы на самом деле вызвать правильный operator<<
для указанного типа. Он делегирует operator<<
для тяжелого подъема. Специализация print_log_value
для ваших пользовательских типов официально поддерживается Boost [править] и выполняется таким образом.
Предполагая, что ваш тип называется Timestamp
(это в моем коде), сначала необходимо определить глобальный свободный operator<<
для Timestamp
:
static inline std::ostream& operator<< (std::ostream& os, const Mdi::Timestamp& ts)
{
os << "Timestamp";
return os;
}
...а затем обеспечить print_log_value
специализацию для него, делегируя к operator<<
вы только что определили:
namespace boost { namespace test_tools {
template<>
struct print_log_value<Mdi::Timestamp > {
void operator()(std::ostream& os,
Mdi::Timestamp const& ts)
{
::operator<<(os,ts);
}
};
}}
Какие были ошибки? – Dennis
Он не компилируется ... И я работаю в Codeblocks, поэтому не могу скопировать-вставить ошибки. И все они находятся в файле test_tools.hpp, и я не совсем понимаю, о чем они (я упомянул первый в сообщении). Должен ли я давать больше примеров? – Ioana
Я скомпилировал с gcc, и я хотел бы вставить ошибки, но это слишком длинный для 11400 символов. – Ioana