`cout << x`和`cout.operator <<(x)`之间的区别?

Sta*_*ked 2 c++

我一直在尝试使用for_each将字符串向量打印到cout.但是,在制定语句时,我发现std::ostream::operator<<(const std::string &);未定义导致编译器错误.以下代码说明了该问题:

#include <iostream>
#include <string>


int main()
{
    std::string message = "Hello World!\n";

    // This works
    std::cout << message;

    // Compiler error
    std::cout.operator <<(message);
}
Run Code Online (Sandbox Code Playgroud)

我认为这两个语句看起来应该与编译器完全相同.显然他们不是.那么有什么不同呢?

解决了

正如Tomalak和Prasoon表示我需要调用此函数:

std::ostream& operator<<(std::ostream&, const std::string&);
Run Code Online (Sandbox Code Playgroud)

所以以下示例将起作用:

#include <iostream>
#include <string>


int main()
{
    std::string message = "Hello World!\n";
    operator<<(std::cout, message);
}
Run Code Online (Sandbox Code Playgroud)

至于我原来的目标(用的for_each打印字符串的向量):现在看来似乎是更好地使用std::copy具有std::ostream_iterator如下图所示:如何使用的for_each输出cout的?

Lig*_*ica 13

你在找std::ostream& operator<<(std::ostream&, const std::string&);.这是一个免费的功能.

  • @Tomalak:我认为Artur是一个巨魔; 他试图在[这个问题](http://stackoverflow.com/q/4754884/10320)的评论中证明使用未定义的行为. (2认同)

Pra*_*rav 13

std::cout << message;等同于operator << (std::cout, message)你写的不是.

运算符<<已被定义为自由函数而不是成员函数

std::ostream& operator<<(std::ostream& out, const std::string& s) { ... }