Why is the compiler complain in stringstream?

the read() function in the stringstreram class returns a istream& type. So if I do a call like this...

std::istream readStream =  mDataStream.read(buffer, buffersize);

I am getting a compilation error "synthesized method ‘std::basic_istream<char, std::char_traits<char> >::basic_istream(const std::basic_istream<char, std::char_traits<char> >&)"

Then I change to like this.

std::istream* readStream =  mDataStream.read(buffer, buffersize);

Then I get this error....
invalid conversion from ‘void*’ to ‘std::istream*

What I am doing wrong?
prainAsked:
Who is Participating?
 
Infinity08Connect With a Mentor Commented:
>> std::istream readStream =  mDataStream.read(buffer, buffersize);

Copying streams is not defined.


>> std::istream* readStream =  mDataStream.read(buffer, buffersize);

You can't assign a reference to a pointer.


Try this :

std::istream& readStream =  mDataStream.read(buffer, buffersize);

Open in new window

0
 
aikimarkCommented:
what language and development tool are you using?
0
 
cupCommented:
Take this program, change it to the way you're using it and post it back.  It is difficult to visualize what your problem is.  This one works in Visual studio

#include <sstream>

struct Dummy
{
   std::istringstream mResult;
   std::istream* read (char* buffer, int buffersize)
   {
      return &mResult;
   }
} mDataStream;

int main ()
{
   char buff[1024];
   std::istream* readStream = mDataStream.read (buff, sizeof(buff));
   return 0;
}

Open in new window

0
The new generation of project management tools

With monday.com’s project management tool, you can see what everyone on your team is working in a single glance. Its intuitive dashboards are customizable, so you can create systems that work for you.

 
prainAuthor Commented:
I am developing on Unix/g++. I am confused with what the compiler says.
If I use the function without the return type, it's great.
For example...

mDataStrea.read(buffer, bufferSize);

But if I capture the return type, I get this problem...
std::istream* readStream =  mDataStream.read(buffer, buffersize);

error: invalid conversion from ‘void*’ to ‘std::istream*’

BTW, my mDataStream is a C++ stringstream instance. So unfortunately I cannot use your code in my C++ class. I have to stick to the stringstream instance.
-prain
0
 
prainAuthor Commented:
Someone try this simple example and tell me why the compiler is barking..
BTW, I using Unix/g++

#include <string>
#include <iostream>
#include <sstream>

int main ()
{
   std::stringstream sstr;

   sstr << "Hello" << " World" ;

   char buffer[100];
   int size = 11;

   std::istream* aIStream = sstr.read(buffer, size);


  return 0;
}
0
 
prainAuthor Commented:
BTW, since stringstream inherits istream, the read() in istream is defined as this:

istream& read ( char* s, streamsize n );
0
 
prainAuthor Commented:
Thanks
0
 
sarabandeCommented:
FYI:

it is intended by design that a stream cannot be copied. they explicitly didn't provide a copy constructor (and no assignment operator) cause a stream is not a normal container but has status and position members stored for streaming purposes. in your case the read member function returns a reference to istream while the stream you used was a stringstream. so you don't get a reference to the original stream but only to the istream baseclass.

the reasons why the read member function returns a reference to istream is not mainly to assign the return value to a second variable (you still could/should use the first variable) but for two other purposes. one is that the read would return NULL in case the read operation failed (error or end-of-stream), what makes it possible to do a read like

if (!mDataStream.read(buffer, buffersize))
{
    ...

Open in new window


or to use a read in a while statement.

the other is that you could use the returned stream reference to pass it to next stream operation:

(mDataStream.read(buffer, 4)).read(&buffer[4], 2);

Open in new window


what in case of read looks strange but was often used for operator>> like in

if (mDataStream >> i >> j)

Open in new window


to do a formatted read into more variables with one statement.

Sara
0
All Courses

From novice to tech pro — start learning today.