不能做运算符 << 重载

Cannot do operator << overloading

我刚开始学习 CPP,但遇到运算符重载问题。 我想重载 ostream 库中的“<<”运算符。 这是我在头文件中的声明:

friend ostream& operator<<(ostream &out ,const Stone s);

这就是 cpp 文件:

ostream& Stone:: operator<<( ostream &out , const Stone s ){

给出的错误是: 1 IntelliSense: class "Stone" 没有成员 "operator<<"

我做错了什么?

问题是你的cpp文件

std::ostream& Stone::operator<<(std::ostream& stream, const Stone s)
              ^^^^^
{
}

它不是成员函数,应该是:

// Also note the 2nd argument is `const &` (i.e., don't copy the object if you don't have to
std::ostream& operator<<(std::ostream& stream, const Stone& foo)
{

}

完整示例

如果您仍然遇到问题,您应该 post 更多代码 and/or 您的错误。以下对我有用。

#include <iostream>

class Foo
{
public:
    Foo() : mValue(99) {}

    friend std::ostream& operator<<(std::ostream& stream, const Foo& foo);

private:
    int mValue;
};

std::ostream& operator<<(std::ostream& stream, const Foo& foo)
{
    return stream << foo.mValue;
}

int main()
{
    Foo f;
    std::cout << f << "\n";

    return 0;
}

在头文件中,友元声明需要在classStone.

的定义内

在源文件(你称之为"cpp")文件中,头文件需要在尝试define/implement operator<<().

之前包含

朋友不是会员,因此不应在前面加上 Stone::

其他一些细节。

  • 永远不要在头文件中使用 using namespace std 因为它会导致 难以恢复的歧义。姓名 ostream 完整(即 std::ostream)。

  • operator<<() 的第二个参数通常最好作为
    const引用,不按值传递。