使用 * 分配给 ostream_iterators

Posted

技术标签:

【中文标题】使用 * 分配给 ostream_iterators【英文标题】:Assigning to ostream_iterators using * 【发布时间】:2016-06-04 19:20:41 【问题描述】:

在 Stroustrup 的 C++ 编程语言(第 4 版) 的第 107 页上,是通过分配给 ostream_iterators 写入的示例。下面是示例子集的逐字复制,但我无法在 VS2015 上编译它而不会出现错误,并且我不理解错误消息

std::ostream_iterator<string> oo  cout ;
*oo2 = "Hello, ";        // compile error, see below
++oo2;

我也试过

*oo2 = string("Hello");  // same error

很长的错误消息的开头如下

1>c:\program files (x86)\microsoft visual studio 14.0\vc\include\iterator(317): error C2679: binary '<<': no operator found which takes a right-hand operand of type 'const std::string' (or there is no acceptable conversion)
1>  c:\program files (x86)\microsoft visual studio 14.0\vc\include\ostream(495): note: could be 'std::basic_ostream<char,std::char_traits<char>> &std::basic_ostream<char,std::char_traits<char>>::operator <<(std::basic_streambuf<char,std::char_traits<char>> *)'
<...more...>

使用 char * 的不同版本可以正常工作:

// works
std::ostream_iterator<const char *> oo5 std::cout ;  //const or no const, either works
*oo5 = "hello, ";
++oo5;
*oo5 = " world\n";

字符串版本有什么问题?这是书中的错误还是我的错误?谢谢

编辑 我还要注意:

std::ostream_iterator<char> oo std::cout ;
string s "hello, stream_iterator<char>, copy string" ;
std::copy(s.begin(), s.end(), oo);

作品

【问题讨论】:

你是否加入了&lt;string&gt; 这就是问题所在!谢谢。在#include 之前,我实际上在几个地方使用了字符串而没有发生任何事故。我不明白为什么这会完全修复它,但确实如此。 字符串类被标准库的一些其他部分使用,所以有时通过一些实现特定的头文件引入,而这个头文件不一定会带来&lt;string&gt;头文件中的所有内容使用它(例如operator&lt;&lt; 重载)。 【参考方案1】:

您的代码有错字。这样做效果更好吗?

#include <iostream>
#include <ostream>
#include <string>
int main()

    std::ostream_iterator<std::string> oo2 std::cout ;
    *oo2 = "Hello, ";
    ++oo2; 
    return 0;

我得到这个输出:

你好,

【讨论】:

以上是关于使用 * 分配给 ostream_iterators的主要内容,如果未能解决你的问题,请参考以下文章

c++之iostream迭代器用法超详细整理!!!

求助……关于iterator

使用 Swift 将新图像分配给 UIImageView

用于更新分配给资源的标签的 Azure API

使用 Keycloak API 以编程方式将角色分配给组

无法使用 .map() 分配给只读属性。使用 NextJs 反冲