我已經確定了三種方法來解決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<<
通過沒有比較你的工作類型的需要一個項目到另一個,但只檢查一個布爾:
BOOST_CHECK (first == second);
請選擇您的首選方法。
我的首選是第一個,但是實施起來是非常有挑戰性的。如果你只是在全球範圍內定義一個operator<<
,它將不起作用。我認爲這是因爲名稱解析存在問題。解決這個問題的一個流行建議是將operator<<
置於std
命名空間中。這至少在一些編譯器的實踐中起作用,但我不喜歡它,因爲標準禁止向std
名稱空間添加任何內容。
我發現的一個更好的方法是爲您的類型實現一個自定義的print_log_value
類模板專業化。 print_log_value
是Boost.Test內部的一個類模板useb,用於爲指定類型實際調用正確的operator<<
。它代表operator<<
做繁重的工作。爲您的自定義類型專門提供print_log_value
由Boost [引文需要]正式支持,並因此完成。
假設你的類型被稱爲Timestamp
(這是在我的代碼),首先定義Timestamp
全球自由operator<<
:
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