在以下代码中:
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);
工作。
我错过了什么?
编辑:我只是愚蠢...忘了包含“字符串”标题谢谢!
答案 0 :(得分:6)
您不需要重载operator<<
来处理字符串,它已经知道如何处理它们。
std::copy( test.begin(), test.end(),
std::ostream_iterator<std::string>( file, "\n" ) );
将产生:
str1
str2
你想在那里完成任何不同/特殊的事吗?
答案 1 :(得分:2)
正如大卫已经指出的那样,字符串已经有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
命名空间中添加内容,因为它可能具有不可预见的特定于实现的效果,并且可能会破坏标准库中的所有内容。此外,无法保证您的标准库实现具有可重载的运算符&lt;&lt;。这意味着,它可以工作,也可以不工作。
答案 2 :(得分:1)
Lemme只需添加cplusplus.com中的链接以供将来参考