2010-07-14 112 views
1

工作在下面的代码:重载运算符<<以字符串

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

要格式化代码,使用1010按钮。 – 2010-07-14 10:16:26

回答

6

你不需要重载operator<<来处理字符串,它已经知道如何处理它们。

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

会产生:

str1 
str2 

有什么不同/特别要在那里做什么?

+1

这个 - 在中已经有一个运算符<< overload。 – Puppy 2010-07-14 10:23:56

+0

我很笨!之所以上述不工作实际上是有趣的:)(提示:缺少包括)p.s.对不起,这个愚蠢的问题:) – HotHead 2010-07-14 10:29:46

2

正如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命名空间不允许普通用户,因为它可能是不可预见的,并可能打破各种东西的标准库中实施的具体效果。此外,不能保证您的标准库的实施具有可重载的运营商< <。这意味着,它可以工作或不能。