重载 vector<T> 的输出流运算符

新手上路,请多包涵

重载输出流运算符的推荐方法是什么?以下不能做。如果没有为类型 T 定义运算符 <<,则预计编译将失败。

 template < class T >
inline std::ostream& operator << (std::ostream& os, const std::vector<T>& v)
{
    os << "[";
    for (std::vector<T>::const_iterator ii = v.begin(); ii != v.end(); ++ii)
    {
        os << " " << *ii;
    }
    os << " ]";
    return os;
}

编辑:它确实编译,问题不相关并且在命名空间中。感谢您的帮助。

原文由 Leonid 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 635
2 个回答

你真的尝试过这段代码吗?它在 gcc 上运行良好,只需稍加调整 std::vector<T>::const_iterator ,需要声明为 typename std::vector<T>::const_iterator

使用 std::copy 和 std::ostream_iterator 可能会更好。

编辑: 类型,依赖类型和类型名 不能全部放在评论中,所以这里是(顺便说一句。这是我的理解,我可能会离开一个国家英里 - 如果是这样,请纠正我!)……

我认为这最好用一个简单的例子来解释..

假设你有一个函数 foo

 template <typename T>
void foo()
{
  T::bob * instofbob; // this is a dependent name (i.e. bob depends on T)
};

看起来不错,通常你可以这样做

class SimpleClass
{
  typedef int bob;
};

并打电话

foo<SimpleClass>(); // now we know that foo::instofbob is "int"

再次,似乎不言自明,但是一些 nuser 出现并这样做

class IdiotClass
{
  static int bob;
};

现在

foo<IdiotClass>(); // oops,

您现在拥有的是一个表达式(乘法),因为 IdiotClass::bob 解析为非类型!

对人类来说,很明显这是愚蠢的,但是编译器无法区分类型和非类型,并且默认情况下在 C++ 中(我认为这是编译器不同的地方), 所有 合格的 _依赖名称_(即 T ::bob) 将被视为 _非类型_。要 明确 告诉编译器依赖名称是真实类型,必须指定 typename 关键字 -

 template <typename T>
void foo()
{
  typedef typename T::bob *instofbob; // now compiler is happy, it knows to interpret "bob" as a type (and will complain otherwise!)
};

即使它是 typedef 也适用。 IE

 template <typename T>
void foo()
{
  typedef typename T::bob local_bob;
};

那是不是更清楚了?

原文由 Nim 发布,翻译遵循 CC BY-SA 2.5 许可协议

这就是你想要的:

 template < class T >
std::ostream& operator << (std::ostream& os, const std::vector<T>& v)
{
    os << "[";
    for (typename std::vector<T>::const_iterator ii = v.begin(); ii != v.end(); ++ii)
    {
        os << " " << *ii;
    }
    os << "]";
    return os;
}

您忘记了第一个上的 std:: ostream

您在 [ 中的 os << "[" 之后放置了一个额外的空格。

你需要 typenamestd::vector<T>::const_iterator 之前

原文由 Jason Iverson 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题