重载运算符<<为字符串工作

时间:2010-07-14 10:06:36

标签: c++ string file-io vector operator-overloading

在以下代码中:

 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);工作。

我错过了什么?

编辑:我只是愚蠢...忘了包含“字符串”标题

谢谢!

3 个答案:

答案 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中的链接以供将来参考

http://www.cplusplus.com/reference/algorithm/copy/