2

我有一个类,可以将二进制文件的一部分读入不同类型的变量中。

class Foo {
public:
    size_t getSizeT();
    float getFloat();
    std::string getString();
private:
    std::ifstream stream;
};

现在我想实现这个答案中描述的流提取运算符。

class Foo {
public:
    Foo &operator>>(Foo &foo, size_t &value);
    Foo &operator>>(Foo &foo, float &value);
    Foo &operator>>(Foo &foo, std::string &value);
private:
    std::ifstream stream;
};

代码无法编译并显示此错误消息:error C2804: binary 'operator >>' has too many parameters。如何正确覆盖流提取运算符?它应该区分类型并且可以链接。

4

2 回答 2

3

作为自由函数,操作符签名应该是:

Foo& operator >>(Foo& foo, size_t& value);

作为成员函数(您的情况),它应该是:

Foo& operator >>(size_t& value);
于 2014-05-18T15:51:32.203 回答
2

如果您的类的实例是数据源,那么您有两种编写输入运算符函数的方法:或者作为一个独立的全局函数,采用两个参数,您的类的实例和目标对象。或者你把它写成你的类的成员函数,然后它只需要一个作为目标的参数。

因此,对于您编写的全局函数,例如

class Foo { ... };

Foo& operator>>(Foo& foo, int& i)
{
    // Get an integer and writes to `i` here
    return foo;
}

对于您编写的成员函数,例如

class Foo
{
public:
    ...

    Foo& operator>>(int& i)
    {
        // Get an integer and writes to `i` here
        return *this;
    }
};

我认为您将运算符写错的原因是因为您可以编写第一个版本,使用全局函数,作为类内联的元函数,并且您在弄错友元函数和成员函数之间的区别之前已经看到了这一点。

您使用朋友功能,例如

class Foo
{
public:
    ...

    // Notice the keyword `friend` 
    friend Foo& operator>>(Foo& foo, int& i)
    {
        // Get an integer and writes to `i` here
        return foo;
    }
};

成员函数和友元函数之间的区别很微妙但非常重要。

于 2014-05-18T15:58:20.470 回答