Beim Schreiben einer Testsuite musste ich eine Implementierung von operator<<(std::ostream&...
für Boost Unit Test zu verwenden.
Das hat funktioniert:
namespace theseus { namespace core {
std::ostream& operator<<(std::ostream& ss, const PixelRGB& p) {
return (ss << "PixelRGB(" << (int)p.r << "," << (int)p.g << "," << (int)p.b << ")");
}
}}
Das war nicht der Fall:
std::ostream& operator<<(std::ostream& ss, const theseus::core::PixelRGB& p) {
return (ss << "PixelRGB(" << (int)p.r << "," << (int)p.g << "," << (int)p.b << ")");
}
Offenbar wurde der zweite nicht in die Kandidatenübereinstimmungen aufgenommen, als g++ versuchte, die Verwendung des Operators aufzulösen. Warum (welche Regel verursacht dies)?
Der Code, der operator<<
ist tief in der Boost Unit Test Framework, aber hier ist der Test-Code:
BOOST_AUTO_TEST_SUITE(core_image)
BOOST_AUTO_TEST_CASE(test_output) {
using namespace theseus::core;
BOOST_TEST_MESSAGE(PixelRGB(5,5,5)); // only compiles with operator<< definition inside theseus::core
std::cout << PixelRGB(5,5,5) << "\n"; // works with either definition
BOOST_CHECK(true); // prevent no-assertion error
}
BOOST_AUTO_TEST_SUITE_END()
Als Referenz verwende ich g++ 4.4 (obwohl ich im Moment davon ausgehe, dass dieses Verhalten standardkonform ist).