简单的c ++运算符重载帮助

时间:2011-05-24 05:21:33

标签: c++ operators operator-overloading overloading iostream

如何重载<<运算符?从我收到的错误来看,std::cout似乎不知道如何使用<<

这是一堂课:

// uint64_t UPPER, LOWER;
std::ostream & operator<<(std::ostream & stream){
    if (UPPER)
        stream << UPPER;
    stream << LOWER;
    return stream;
}

我得到的error: no match for 'operator<<' in 'std::cout << test'似乎没有意义。

编辑:

这两个都没有:

std::ostream & operator<<(std::ostream & stream, uint128_t const & val){
    if (val.upper())
        stream << val.upper();
    stream << val.lower();
    return stream;
}

也不是:

std::ostream & operator<<(std::ostream & stream, uint128_t val){
    if (val.upper())
        stream << val.upper();
    stream << val.lower();
    return stream;
}

正在改变错误。

3 个答案:

答案 0 :(得分:3)

<<运算符有两个参数,一个左侧和一个右侧。因此,您必须使用两个参数定义函数:

std::ostream operator<<(std::ostream &os, const MyClass &obj);

就我记忆而言,你必须在课堂定义之外定义它。在类定义中,您只能使用将该类作为左侧的运算符。

答案 1 :(得分:2)

您通常希望operator<<()重载是一个'自由函数'(在您的类之外),因此它可以自然地绑定到流:

// this is outside your class definition
std::ostream& operator<<(std::ostream& os, const myclass& rhs)
{
    // whatever...

    return os;
}

然后在你的课堂内,如果需要你宣布它为friend,这样它就可以进入班级内部:

friend std::ostream& operator<<(std::ostream& os, const myclass& rhs);

将此作为friend(某些人认为打破封装)的替代方法是在您的类中使用公共函数将其自身输出到流并在{{1}中调用它过载:

operator<<()

答案 2 :(得分:1)

一个类外的

operator<<需要两个参数:

std::ostream& operator<<(std::ostream& stream, type_you_want_output const& thing)