【问题标题】:Overloading operator<< to work for string重载 operator<< 为字符串工作
【发布时间】:2011-03-15 18:40:13
【问题描述】:

在以下代码中:

 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 &lt;&lt; 的正确方法是什么? copy(test.begin(), test.end(), sIt); 工作。

我错过了什么?

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

谢谢!

【问题讨论】:

  • 要格式化代码,请使用 1010 按钮。

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


【解决方案1】:

请添加来自 cplusplus.com 的链接以供将来参考

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

【讨论】:

    【解决方案2】:

    正如大卫已经指出的那样,已经有一个operator&lt;&lt; 用于字符串,所以你不必提供一个。如果您真的想定义自己的重载,那么会有一个小问题,因为实际上您不允许这样做。 operator&lt;&lt; 定义在std 命名空间中,所以如果你想为std::string 提供一个可用的重载(大多数实现中的版本是模板函数,所以潜在的重载) ,您也必须在 std 命名空间中执行此操作(这是因为 C++ 中解决歧义和重载的方式,这里有一些警告)。例如:

    namespace std {
     ostream& operator<< (ostream& out,const string & str)
      {     
        out << "A STRINGY:" << str.c_str();     
        return out; 
      }
    }
    

    但是,普通用户不允许在std 命名空间中添加内容,因为它可能会产生无法预见的特定实现效果,并且可能会破坏标准库中的各种内容。此外,不能保证您的标准库实现具有可重载的运算符

    【讨论】:

      【解决方案3】:

      您不需要重载operator&lt;&lt; 来处理字符串,它已经知道如何处理它们。

      std::copy( test.begin(), test.end(), 
                 std::ostream_iterator<std::string>( file, "\n" ) );
      

      将产生:

      str1
      str2
      

      有什么不同/特别的事情你想在那里完成吗?

      【讨论】:

      • 我很蠢!!!以上不起作用的原因实际上很有趣:)(提示:缺少包含) p.s.抱歉这个愚蠢的问题:)
      猜你喜欢
      • 1970-01-01
      • 2014-02-06
      • 1970-01-01
      • 1970-01-01
      • 2011-07-19
      • 2012-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多