Разрешение шаблона - оператор << не найден в буст-тесте - PullRequest
0 голосов
/ 29 ноября 2018

Следующий код работает нормально:

#define BOOST_TEST_MODULE TestFoo
#include <boost/test/unit_test.hpp>
#include <boost/dynamic_bitset.hpp>
#include <string>

template <typename T>
std::ostream& operator<<(std::ostream& os, const std::vector<T> &v)
{
    os << "[ ";
    for ( const T& elem : v )
        os << elem << ' ';
    return os << ']';
}

typedef boost::dynamic_bitset<> BS;
static const std::vector<BS> foo = { BS(std::string("101")) };

BOOST_AUTO_TEST_CASE( test_foo )
{
    BOOST_CHECK_EQUAL( foo[0], foo[0] );
}

Однако, когда я заменяю контрольный пример на

BOOST_AUTO_TEST_CASE( test_foo )
{
    BOOST_CHECK_EQUAL( foo, foo );
}

, компилятор больше не находит operator<<:

/usr/include/boost/test/test_tools.hpp:326:14: error: no match for ‘operator<<’ (operand types are ‘std::ostream {aka std::basic_ostream<char>}’ and ‘const std::vector<boost::dynamic_bitset<> >’)

Я бы ожидал, что компилятор создаст шаблон operator<<, определенный выше.Почему этого не происходит / как исправить?

1 Ответ

0 голосов
/ 29 ноября 2018

edit: см. Комментарий, это UB - похоже, «хорошего» решения проблемы не существует.

оберните op<< в namespace std {...}

#include <boost/dynamic_bitset.hpp>
#include <boost/test/unit_test.hpp>

namespace std { // THIS LINE

template <typename T, typename... Rest>
std::ostream& operator<<(std::ostream& os, const std::vector<T, Rest...> &v)
{
    os << "[ ";
    for ( const T& elem : v )
        os << elem << ' ';
    os << ']';
    return os;
}
} // THIS LINE

typedef boost::dynamic_bitset<> BS;
static const std::vector<BS> foo = { BS(std::string("101")) };


BOOST_AUTO_TEST_CASE( test_foo )
{
    BOOST_CHECK_EQUAL( foo, foo );
}

https://godbolt.org/z/xoW-IJ

В противном случае он не будет искать подходящее пространство имен для вашей реализации.Уверен, что это ADL: https://en.cppreference.com/w/cpp/language/adl

...