2012-01-16 2 views
2

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

ответ

2

Вы можете использовать безымянное пространство имен (непроверенные с 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; 
}