1

我有简单的设置:

#include<iostream>

class Stuff {};

ostream &operator<<(ostream &lhs, const Stuff &rhs) {
    return lhs << "something";
}

int main() {
    Stuff stuff;

    cout << stuff << endl;
    cin.get();
}

该函数将模型类operator<<打印到. 我想做的就是将该函数移到类本身中。如:StuffostreamStuff

class Stuff {
    ostream &operator<<(ostream &lhs, const Stuff &rhs) {
        return lhs << "something";
    }
};

不过,对于我的生活,我无法弄清楚如何让它发挥作用。我感觉到我正在尝试从右侧重新定义左关联运算符。有没有办法正确地做到这一点?

4

1 回答 1

3

按照您定义它的方式,该函数将是 的成员Stuff,因此如果在 C++ 中允许它,您必须像这样调用它:

Stuff stuff;
stuff.operator<<(std::cout, stuff);

所以你不想要那个。

二元运算符(如<<)有两个参数(称为操作数)。如果它是(非静态)成员函数,那么它必须是带有一个参数的成员函数,其中左操作数是您调用函数的对象,右操作数是函数参数。所以你可以这样做:

struct Stuff {
  std::ostream& operator<<(std::ostream& o) { return o << something; }
};

Stuff s;
s << std::cout << std::endl;

但你可能也不想要那个!

要编写std::cout << s运算符,必​​须是左操作数的成员或必须是非成员函数,因此不能使其成为Stuff.

也许你想要做的是:

class Stuff {
    friend std::ostream& operator<<(std::ostream& lhs, const Stuff& rhs) {
        return lhs << "something";
    }
};

friend函数不是成员函数,因此这是有效的。

于 2013-09-05T16:59:05.590 回答