справка по перегрузке простого оператора C ++ - PullRequest
1 голос
/ 24 мая 2011

Как перегрузить оператор <<? Судя по полученной ошибке, 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 ]

3 голосов
/ 24 мая 2011

Оператор << принимает два аргумента: левый и правый. Поэтому вы должны определить функцию с двумя параметрами:

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

И вы должны определить это вне определения вашего класса, насколько я помню. Внутри определения класса вы можете иметь только операторы, которые принимают этот класс в качестве левой части.

2 голосов
/ 24 мая 2011

Обычно вы хотите, чтобы перегрузка 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 (что некоторые люди считают нарушением инкапсуляции) - иметь публичную функцию вваш класс, который будет выводить себя в поток и вызывать его при вашей перегрузке operator<<():

// inside class myclass - a normal public member function
std::ostream& dump( std::ostream& os)
{
    os << some_class_member; 

    // ...

    return os;
}


// now, the `operator<<()` overload doesn't need to be a friend
// this is still outside your class definition
std::ostream& operator<<(std::ostream& os, const myclass& rhs)
{
    return rhs.dump(os);
}
1 голос
/ 24 мая 2011

operator<< вне класса требует двух аргументов:

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