简体   繁体   中英

About std::ostream constructor

I want to use std::ostream like this:

int main()
{
    std::ostream os;
    os << "something ..." << std::endl;
    return 0;
}

There's an error said that the ostream constructor is protected:

error: 'std::basic_ostream<_CharT, _Traits>::basic_ostream() [with _CharT = char; _Traits = std::char_traits]' is protected.

But I remember operator<< could be overloaded like this:

// In a class. 
friend std::ostream & operator<<(std::ostream& out, const String & s) {
    out << s.m_s;
    return out;
}

Any advice on why my code doesn't work?

The std::ostream , the std::istream or the std::iostream are base classes of stream types (eg std::stringstream , std::fstream , etc.) in the Standard Library . These classes are protected against instantiation, you can instantiate their derived classes only. The error message

error: 'std::basic_ostream<_CharT, _Traits>::basic_ostream() [with _CharT = char; _Traits = std::char_traits]' is protected

tells you the same.

Your second example is valid because you can use references to the base class of derived classes. In this case no constructor is called, a reference only refers to an existing object. Here is an example how can use std::ostream& to the std::cout :

#include <iostream>

int main() {
    std::ostream& os = std::cout;
    os << "something ..." << std::endl;
}

The reason behind using std::ostream& in overload of operator<< is that you may don't want to overload the the mentioned operator for all individual stream types, but only for the common base class of them which has the << functionality.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM