Для двух пространств имен, каждый из которых предоставляет специализацию оператора < < для std :: vector, можно ли использовать boost :: lexical_cast? Я знаю, что код будет работать, если я продвигаю один из операторов в глобальное пространство имен, но это просто вызывает ошибку неоднозначности в других местах. Есть ли какое-нибудь умное использование директивы «using», которую я могу использовать, чтобы позволить boost :: lexical_cast найти правильный оператор?Использование boost :: lexical_cast с пользовательским оператором << в пространстве имен
//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: До сих пор лучший, что я придумал, чтобы вытащить оператор в пространстве имен станда в .cpp. Это работает, если .cpp требуется только одна версия, но не в общем случае, где .cpp требуется несколько версий.
namespace std
{
using A::operator<<;
}