给定两个命名空间,每个命名空间都为 std::vector 提供 operator<< 的特化,是否可以使用 boost::lexical_cast?我知道如果我将其中一个运算符提升到全局命名空间中,代码将起作用,但这只会在其他位置导致歧义错误。我可以使用“using”指令来允许 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
}
编辑:到目前为止,我想出的最好的方法是将运算符拉入 .cpp 中的 std 命名空间。这适用于 .cpp 只需要一个版本,但不适用于 .cpp 需要多个版本的一般情况。
namespace std
{
using A::operator<<;
}