2

给定两个命名空间,每个命名空间都为 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<<;
}
4

1 回答 1

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;
}
于 2012-01-16T20:32:09.127 回答