如何重载运算符<<在一个结构内

时间:2018-06-14 05:00:01

标签: c++

我只想打印我的结构的两个值,但不能编译我的代码 - 我得到:没有运算符“<<”匹配这些操作数。

#include <iostream>

using namespace std;

struct SCoor
{
    int i, j;

    bool operator == (const SCoor & tmp) const
    {
        return (i == tmp.i && j == tmp.j);
    }

    bool operator < (const SCoor & tmp) const
    {
        return (i < tmp.i || (i == tmp.i && j < tmp.j));
    }

    ostream& operator << (ostream &o) {
        return o << i << " " << j;
    }

};


int main()
{

        SCoor tmp = { 3, 3 };

    cout << tmp;

    return 0;
}

如何让运营商超负荷&#34;&lt;&lt;&#34;?

1 个答案:

答案 0 :(得分:5)

如果您希望结构位于表达式的左侧,则会将<<运算符作为成员函数重载。所以:

struct SCoor
{
    // ...

    SCoor& operator << (Stuff const& s) {
        // ...
        return *this;
    }

};

// ...

Stuff stuff;
SCoor scoor;

scoor << s; // insert s into my SCoor

如果您想使您的结构成为<<表达式的右侧,您必须定义独立函数:

std::ostream& operator<<(std::ostream& os, SCoor const& scoor)
{
    return os << scoor.i << " " << scoor.j;
}

然而,将外部函数设为朋友函数并在struct定义中定义它是很常见的:

struct SCoor
{
    // ...

    friend std::ostream& operator<<(std::ostream& os, SCoor const& scoor)
    {
        return os << scoor.i << " " << scoor.j;
    }

};

// ...

SCoor scoor;

std::cout << scoor << '\n';

但它不是你的struct的成员,为方便起见,它只是在其定义中定义。