Although stringstream
inherits from iostream
, it is not declared in the <iostream>
header. The <iostream>
header contains the definition of the iostream
type along with the famous cout
, cerr
, cin
, and clog
types, but not other types that are iostreams
(for example, file streams). For these, you do need to explicitly #include
the requisite header files.
EDIT: In response to your revised question, I pulled up the C++ spec and interestingly it does not say that <iostream>
has to include either <ostream>
or <istream>
. In fact, it could get away with just including <iosfwd>
. Consequently, it's possible to #include <iostream>
without actually getting a full class definition for either istream
or ostream
. Only explicitly including those headers can guarantee that the definitions of those classes, not just the forward-declarations, are visible.