使用 * 分配给 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);
作品
【问题讨论】:
你是否加入了<string>
?
这就是问题所在!谢谢。在#include 之前,我实际上在几个地方使用了字符串而没有发生任何事故。我不明白为什么这会完全修复它,但确实如此。
字符串类被标准库的一些其他部分使用,所以有时通过一些实现特定的头文件引入,而这个头文件不一定会带来<string>
头文件中的所有内容使用它(例如operator<<
重载)。
【参考方案1】:
您的代码有错字。这样做效果更好吗?
#include <iostream>
#include <ostream>
#include <string>
int main()
std::ostream_iterator<std::string> oo2 std::cout ;
*oo2 = "Hello, ";
++oo2;
return 0;
我得到这个输出:
你好,
【讨论】:
以上是关于使用 * 分配给 ostream_iterators的主要内容,如果未能解决你的问题,请参考以下文章