Учитывая два пространства имен, каждое из которых обеспечивает специализацию оператора << для 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<<;
}