Использование boost :: lexical_cast с пользовательским оператором << в пространстве имен - PullRequest
2 голосов
/ 17 января 2012

Учитывая два пространства имен, каждое из которых обеспечивает специализацию оператора << для std :: vector, возможно ли использовать boost :: lexical_cast? Я знаю, что код будет работать, если я переведу одного из операторов в глобальное пространство имен, но это просто вызывает ошибку неоднозначности в других местах. Есть ли какое-то умное использование директивы using, которое я могу использовать, чтобы boost :: lexical_cast мог найти правильный оператор? </p>

//In some .h file
namespace A
{
  template <typename T, typename A>
  std::ostream & operator<<( std::ostream & os, const std::vector<T, A> & v)
  {
  ...
  }
}

namespace B
{
  template <typename T, typename A>
  std::ostream & operator<<( std::ostream & os, const std::vector<T, A> & v)
  {
  ...
  }
}

//Later in a .cpp
namespace A
{
  std::vector<int> v;
  std::string s = boost::lexical_cast<std::string>(v); //Fails because operator<< is not defined for std::vector in the std namespace
}

namespace B
{
  std::stringstream stream;
  std::vector<int> v;
  stream << v; //This will be ambiguous if we promote the A::operator<< into the std namespace
}

Edit: На данный момент лучшее, что я придумал, это перетащить оператора в пространство имен std в .cpp. Это работает, если .cpp нужна только одна версия, но не в общем случае, когда .cpp требуется несколько версий.

namespace std
{
  using A::operator<<;
}

1 Ответ

2 голосов
/ 17 января 2012

Вы можете использовать безымянное пространство имен (не протестировано с lexical_cast, но работает с другими вещами):

namespace B
{
    operator<<(x, y) { }
}

namespace A
{
    operator<<(x, y) { }

    namespace
    {
        using B::operator<<;

        std::string _s = boost::lexical_cast<std::string>(v);
    }

    std::string& s = _s;
}
...