'std::ios_base::ios_base(const std::ios_base&)’ is private' error while overloading operator<< for std::ostram
Asked Answered
D

3

6

I've got a struct which looks like this:

sturct person
{
    string surname;
    person(string n) : surname(n) {};
}

I need to overload operator<< for std::ostream and person. I wrote this function:

std::ostream operator<<(std::ostream & s, person & os)
{
    s << os.surname;
    return s;
}

but I receive this errors:

/usr/include/c++/4.6/bits/ios_base.h|788|error: ‘std::ios_base::ios_base(const std::ios_base&)’ is private|

/usr/include/c++/4.6/bits/basic_ios.h|64|error: within this context

/usr/include/c++/4.6/ostream|57|note: synthesized method ‘std::basic_ios::basic_ios(const std::basic_ios&)’ first required here |

Dah answered 23/8, 2012 at 10:23 Comment(0)
D
18

std::ostream is not copy constructible, and when you return by value you are copy constructing. Although return value optimization means the copy might not actually be made, the compiler still requires that copying be possible.

The canonical return value for this operator is by non-const reference:

std::ostream& operator<<(std::ostream& o, const SomeType& t);
Dalhousie answered 23/8, 2012 at 10:28 Comment(0)
D
3

Return by reference:

std::ostream& operator<<(...)
          //^

Otherwise an attempt is being made to copy s, and ostreams are non-copyable (the error message is stating an attempt to access a private copy constructor).

Dynode answered 23/8, 2012 at 10:25 Comment(0)
T
2

You forgot reference in return type:

std::ostream &operator<<(std::ostream & s, person & os)
{
    return s << os.surname;
}
Tallula answered 23/8, 2012 at 10:25 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.