Правила поиска операторов C ++ / поиск по Кенигу

При написании набора тестов мне нужно было предоставить реализацию operator << (std :: ostream & ... для Увеличьте модульный тест для использования.

Это сработало:

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 << ")");
    }
}}

Не удалось:

std::ostream& operator<<(std::ostream& ss, const theseus::core::PixelRGB& p) {
    return (ss << "PixelRGB(" << (int)p.r << "," << (int)p.g << "," << (int)p.b << ")");
}

По-видимому, второй не был включен в список кандидатов, когда g ++ попытался разрешить использование оператора. Почему (какое правило вызывает это)?

Код, вызывающий operator << , находится глубоко в структуре модульного тестирования Boost, но вот тестовый код:

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()

Для справки, я использую g ++ 4.4 (хотя на данный момент я предполагаю, что это поведение соответствует стандартам).

14
задан John Bartholomew 5 January 2011 в 12:39
поделиться