在以下代码中:
using namespace std;
//ostream& operator<< (ostream& out,const string & str)
//{
// out << str.c_str();
// return out;
//}
int _tmain(int argc, _TCHAR* argv[])
{
ofstream file("file.out");
vector<string> test(2);
test[0] = "str1";
test[1] = "str2";
ostream_iterator<string> sIt(file);
copy(test.begin(), test.end(), sIt);
file.close();
return 0;
}
重载operator <<
以使copy(test.begin(), test.end(), sIt);
正常工作的正确方法是什么?
我遗漏了什么?
编辑:我就是太傻了。忘记包含"string“标头
谢谢!
发布于 2010-07-14 10:13:21
你不需要重载operator<<
来处理字符串,它已经知道如何处理它们了。
std::copy( test.begin(), test.end(),
std::ostream_iterator<std::string>( file, "\n" ) );
将产生:
str1
str2
你想在那里做些什么不同/特别的事情吗?
发布于 2010-07-14 10:40:48
正如David已经指出的,字符串已经有了一个operator<<
,所以您不必提供一个。如果你真的想要定义自己的重载,那就有一个小问题,因为实际上你不允许这样做。operator<<
是在std
名称空间中定义的,所以如果您希望std::string
有一个可用的重载(大多数实现中的版本是一个模板函数,因此存在潜在的重载),您也必须在std
名称空间中这样做(这是因为在C++中解决歧义和重载的方式,这里有一些注意事项)。例如:
namespace std {
ostream& operator<< (ostream& out,const string & str)
{
out << "A STRINGY:" << str.c_str();
return out;
}
}
但是,普通用户不允许将内容添加到std
名称空间中,因为它可能具有不可预见的特定于实现的效果,并可能破坏标准库中的所有内容。此外,不能保证您的标准库实现具有可重载的operator<<。这意味着,它可以工作,也可以不工作。
发布于 2010-07-14 12:29:55
让我只添加来自cplusplus.com的链接,以供将来参考
https://stackoverflow.com/questions/3245099
复制相似问题