【问题标题】:Cannot do operator << overloading不能做运算符 << 重载
【发布时间】:2015-04-03 12:42:31
【问题描述】:

我刚开始学习 CPP,但遇到了运算符重载的问题。 我想从 ostream 库中重载“

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

那就是cpp文件:

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

给定的错误是: 1 IntelliSense:“Stone”类没有成员“operator

我做错了什么?

【问题讨论】:

  • 不要发布代码图片,而是使用实际代码的复制粘贴。
  • 你定义了一个成员函数,在函数定义中省略Stone::
  • 至于你的问题,在一个类中声明一个友元函数不会使这个函数成为一个member函数。

标签: c++ overloading operator-keyword


【解决方案1】:

问题是你的 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)
{

}

完整示例

如果您仍然遇到问题,您应该发布更多代码和/或您的错误。以下对我有用。

#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;
}

【讨论】:

  • 好的,但现在的问题是,虽然 func 是友元 func,但 Stone 类中的成员无法访问
  • @Itay209 我用一个完整的例子更新了我的答案,但它应该对你有用。如您所见,朋友功能正在访问私有数据成员。
【解决方案2】:

在头文件中,朋友声明需要在类Stone的定义内。

在源文件(你称之为“cpp”)中,需要在尝试定义/实现operator&lt;&lt;()之前包含头文件。

朋友不是会员,所以不能在前面加上Stone::

其他一些细节。

  • 切勿在头文件中使用using namespace std,因为它可能导致 模棱两可,很难从中恢复。姓名ostream 完整(即std::ostream)。

  • operator&lt;&lt;() 的第二个参数通常最好作为一个
    const 引用,而不是按值传递。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-07
    • 1970-01-01
    • 2023-03-03
    • 2015-11-13
    • 2021-02-17
    • 1970-01-01
    • 2013-07-30
    相关资源
    最近更新 更多