No match for 'operator<<' in '((HttpRequest*


E

eric

Dear advanced c/g++ programers:

I have a simple program from book C++ cookbook, page 291, 8.3, Using
Constructors and Destructors to manage
resources (or RAII), but it can not get compiled in my g++
------------------------------------------------------------------------------------------------
// Example 8-3. Using constructors and destructors
#include <iostream>
#include <string>
using namespace std;
class Socket {
public:
Socket(const string& hostname) {}
};
class HttpRequest {
public:
HttpRequest (const string& hostname) :
sock_(new Socket(hostname)) {}
void send(string soapMsg) {sock_ << soapMsg; }
~HttpRequest () {delete sock_;}
private:
Socket* sock_;
};
void sendMyData(string soapMsg, string host) {
HttpRequest req(host);
req.send(soapMsg);
// Nothing to do here, because when req goes out of scope
// everything is cleaned up.
}
int main() {
string s = "xml";
sendMyData(s, "www.oreilly.com");
}
------------------------------------------------------------------------------------------------------------------------
my test compile fail as
----------------------------------
[email protected]:~/cppcookbook/ch8$ g++ Example8-3.cpp
Example8-3.cpp: In member function ‘void
HttpRequest::send(std::string)’:
Example8-3.cpp:13:39: error: no match for ‘operator<<’ in
‘((HttpRequest*)this)->HttpRequest::sock_ << soapMsg’
-------------------------------------------------------------
on both g++ 4.3.4 and 4.5.2
you can get its source code from
http://examples.oreilly.com/9780596007614/
to test by yourself

looking and thanks your help a lot in advance, Eric
 
Ad

Advertisements

I

Ian Collins

Dear advanced c/g++ programers:

I have a simple program from book C++ cookbook, page 291, 8.3, Using
Constructors and Destructors to manage
resources (or RAII), but it can not get compiled in my g++
------------------------------------------------------------------------------------------------
// Example 8-3. Using constructors and destructors
#include<iostream>
#include<string>
using namespace std;
class Socket {
public:
Socket(const string& hostname) {}
};
class HttpRequest {
public:
HttpRequest (const string& hostname) :
sock_(new Socket(hostname)) {}
void send(string soapMsg) {sock_<< soapMsg; }
~HttpRequest () {delete sock_;}
private:
Socket* sock_;
};
void sendMyData(string soapMsg, string host) {
HttpRequest req(host);
req.send(soapMsg);
// Nothing to do here, because when req goes out of scope
// everything is cleaned up.
}
int main() {
string s = "xml";
sendMyData(s, "www.oreilly.com");
}
------------------------------------------------------------------------------------------------------------------------
my test compile fail as
----------------------------------
[email protected]:~/cppcookbook/ch8$ g++ Example8-3.cpp
Example8-3.cpp: In member function ‘void
HttpRequest::send(std::string)’:
Example8-3.cpp:13:39: error: no match for ‘operator<<’ in
‘((HttpRequest*)this)->HttpRequest::sock_<< soapMsg’
-------------------------------------------------------------

You don't have an operator<<( Socket*, const std::string& ) declared
anywhere.
 
E

eric

You don't have an operator<<( Socket*, const std::string& ) declared
anywhere.

I add
// ostream & operator<<(const std::string&) {}
in class Socket
(and : public Socket at class HttpRequest)
or

// ostream & operator<<( Socket*, const std::string& ) {}
in class HttpRequest

neither compile success
/* that book is claim tested good on visual c++ 7.1 in window xp,
would anyone try and post your result? */
so
please help again
and thanks a lot in advance, Eric
 
I

Ian Collins

I add
// ostream& operator<<(const std::string&) {}
in class Socket
(and : public Socket at class HttpRequest)
or

// ostream& operator<<( Socket*, const std::string& ) {}
in class HttpRequest

neither compile success
/* that book is claim tested good on visual c++ 7.1 in window xp,
would anyone try and post your result? */
so
please help again
and thanks a lot in advance, Eric

Post your code and errors.
 
E

eric

Post your code and errors.

--------------------------------------------------------------------
If I tried your fist suggestion
---------------------------------
// Example 8-3. Using constructors and destructors
#include <iostream>
#include <string>
using namespace std;
class Socket {
public:
Socket(const string& hostname) {}

// ostream & operator<<(const std::string&) {}
};
class HttpRequest : public Socket {
public:
HttpRequest (const string& hostname) :
sock_(new Socket(hostname)) {}

ostream & operator<<( Socket*, const std::string& ) {}

void send(string soapMsg) {sock_ << soapMsg; }
~HttpRequest () {delete sock_;}
private:
Socket* sock_;
};
void sendMyData(string soapMsg, string host) {
HttpRequest req(host);
req.send(soapMsg);
// Nothing to do here, because when req goes out of scope
// everything is cleaned up.
}
int main() {
string s = "xml";
sendMyData(s, "www.oreilly.com");
}
-------------------------------------------------------------------------------
compile result is
------------------
[email protected]:~/cppcookbook/ch8$ g++ Example8-3.cpp
Example8-3.cpp:16:53: error: ‘std::eek:stream&
HttpRequest::eek:perator<<(Socket*, const std::string&)’ must take
exactly one argument
Example8-3.cpp: In constructor ‘HttpRequest::HttpRequest(const
std::string&)’:
Example8-3.cpp:14:32: error: no matching function for call to
‘Socket::Socket()’
Example8-3.cpp:7:4: note: candidates are: Socket::Socket(const
std::string&)
Example8-3.cpp:5:14: note: Socket::Socket(const
Socket&)
Example8-3.cpp: In member function ‘void
HttpRequest::send(std::string)’:
Example8-3.cpp:18:39: error: no match for ‘operator<<’ in
‘((HttpRequest*)this)->HttpRequest::sock_ << soapMsg’


------------------------------------------------------------------------------------------------------------------
If I tried my other design, put opearator << in class Socket
---------------------------------------------------
// Example 8-3. Using constructors and destructors
#include <iostream>
#include <string>
using namespace std;
class Socket {
public:
Socket(const string& hostname) {}

ostream & operator<<(const std::string&) {}
};
class HttpRequest: public Socket {
public:
HttpRequest (const string& hostname) :
sock_(new Socket(hostname)) {}

// ostream & operator<<( Socket*, const std::string& ) {}

void send(string soapMsg) {sock_ << soapMsg; }
~HttpRequest () {delete sock_;}
private:
Socket* sock_;
};
void sendMyData(string soapMsg, string host) {
HttpRequest req(host);
req.send(soapMsg);
// Nothing to do here, because when req goes out of scope
// everything is cleaned up.
}
int main() {
string s = "xml";
sendMyData(s, "www.oreilly.com");
}
-------------------------------------------------------------------------------------------------
I get the following compiler error
----------------------------------
[email protected]:~/cppcookbook/ch8$ g++ Example8-3.cpp
Example8-3.cpp: In constructor ‘HttpRequest::HttpRequest(const
std::string&)’:
Example8-3.cpp:14:32: error: no matching function for call to
‘Socket::Socket()’
Example8-3.cpp:7:4: note: candidates are: Socket::Socket(const
std::string&)
Example8-3.cpp:5:14: note: Socket::Socket(const
Socket&)
Example8-3.cpp: In member function ‘void
HttpRequest::send(std::string)’:
Example8-3.cpp:18:39: error: no match for ‘operator<<’ in
‘((HttpRequest*)this)->HttpRequest::sock_ << soapMsg’
 
I

Ian Collins

------------------------------------------------------------------------------------------------------------------
If I tried my other design, put opearator<< in class Socket
---------------------------------------------------
// Example 8-3. Using constructors and destructors
#include<iostream>
#include<string>
using namespace std;
class Socket {
public:
Socket(const string& hostname) {}

ostream& operator<<(const std::string&) {}
};
class HttpRequest: public Socket {

Why is HttpRequest derived from Socket?
public:
HttpRequest (const string& hostname) :
sock_(new Socket(hostname)) {}

// ostream& operator<<( Socket*, const std::string& ) {}

This can't be a class member, declare it outside of the class and look
at the return type (hint: where do you get an ostream to return?).
hope that help any advanced c/g++ program to debug my(actually
author's) program

The original code is pretty smelly (and wouldn't compile), but you've
made it worse!
 
Ad

Advertisements

E

eric

Why is HttpRequest derived from Socket?



This can't be a class member, declare it outside of the class and look
at the return type (hint: where do you get an ostream to return?).


The original code is pretty smelly (and wouldn't compile), but you've
made it worse!
------------------------------------------------------------------------------

why I tried to use : public Socket ?
because I guess , << operator used in
void send(string soapMsg) {sock_ << soapMsg; }
in class HttpRequest
used declaration in class Socket

Need any advanced c/g++ programers suggestion/help and thanks a lot in
advance, Eric

Eric
 
Ad

Advertisements

E

eric

=================================================
"eric" <[email protected]> ha scritto nel messaggioDear advanced c/g++ programers:
  I have a simple program from book C++ cookbook, page 291, 8.3, Using
Constructors and Destructors to manage
resources (or RAII), but it can not get compiled in my g++
------------------------------------------------------------------------------------------------
// Example 8-3.  Using constructors and destructors
#include <iostream>
#include <string>
using namespace std;
class Socket {
public:
   Socket(const string& hostname) {}};

class HttpRequest {
public:
  HttpRequest (const string& hostname) :
     sock_(new Socket(hostname)) {}
  void send(string soapMsg) {sock_ << soapMsg; }
  ~HttpRequest () {delete sock_;}
private:
   Socket* sock_;};

void sendMyData(string soapMsg, string host) {
   HttpRequest req(host);
   req.send(soapMsg);
   // Nothing to do here, because when req goes out of scope
   // everything is cleaned up.}

int main() {
   string s = "xml";
   sendMyData(s, "www.oreilly.com");}

------------------------------------------------------------------------------------------------------------------------
my test compile fail as
----------------------------------
[email protected]:~/cppcookbook/ch8$ g++ Example8-3.cpp
Example8-3.cpp: In member function void
HttpRequest::send(std::string) :
Example8-3.cpp:13:39: error: no match for operator<< in
((HttpRequest*)this)->HttpRequest::sock_ << soapMsg
-------------------------------------------------------------
on both g++ 4.3.4 and 4.5.2
you can get its source code fromhttp://examples.oreilly.com/9780596007614/
to test by yourself

looking and thanks your help a lot in advance, Eric
========================================================

this here compile and run: i.e. print "xml" in "thisfile"
file in this directory;
this not send nothing in the net, just open and write a file

--------------------
// Example 8-3.  Using constructors and destructors
#include <stdio.h>
#include <iostream>
#include <string>
#define  u8  unsigned char

#if   ULONG_MAX == 0xFFFFFFFF
#define  u32 unsigned long
#elif UINT_MAX  == 0xFFFFFFFF
#define  u32 unsigned int
#elif USHRT_MAX == 0xFFFFFFFF
#define  u32 unsigned short
#else
#error  "Non posso compilare con questo sistema"
#endif

#define  uns  unsigned

// macro for function
#define  P  printf

// macro for keyWords
#define G  goto
#define R  return
#define W  while
#define F  for
#define T  template
#define TN typename
#define S  sizeof

using namespace std;

class Socket{
public:

Socket(string& hostname)
{u8  *a=hostname.c_str();

 fsck=fopen(a , "w+b");}

~Socket(){fsck=(FILE*)fclose(fsck);
// better without this assignament but
// here somone has to print a message if fsck==-1

}

 u32 send(string& soapMsg)
 {size_t  k, slen;

  slen=soapMsg.length();
  F(k=0; k<slen ; ++k)
      if( fputc(soapMsg[k], fsck) == EOF )  break;
  if(k!=slen)  R  -1;
  R  0;
 }

 FILE*  fsck;

};

u32 sendMyData(string soapMsg, string host) {
   Socket  req(host);

   R  req.send(soapMsg);

   // Nothing to do here, because when req goes out of scope
   // everything is cleaned up.

}

int main(void)
{string  s="xml";
 sendMyData(s, "thisfile");

 R  0;

}

[email protected]:~/cppcookbook/ch8$ g++ Example8-3-2.cpp
Example8-3-2.cpp:14:2: error: #error "Non posso compilare con questo
sistema"
Example8-3-2.cpp:47:2: error: ‘u32’ does not name a type
Example8-3-2.cpp: In constructor ‘Socket::Socket(std::string&)’:
Example8-3-2.cpp:37:24: error: invalid conversion from ‘const char*’
to ‘unsigned char*’
Example8-3-2.cpp:39:22: error: invalid conversion from ‘unsigned
char*’ to ‘const char*’
Example8-3-2.cpp:39:22: error: initializing argument 1 of ‘FILE*
fopen(const char*, const char*)’
Example8-3-2.cpp: At global scope:
Example8-3-2.cpp:61:1: error: ‘u32’ does not name a type
Example8-3-2.cpp: In function ‘int main()’:
Example8-3-2.cpp:73:26: error: ‘sendMyData’ was not declared in this
scope
---------------------------------------------------------------------------------------------------------
Thanks Io_x
and your suggestion
above is my compiler 's response of your test program. I will try to
learn more by myself. And at meantime,
I guess it is not difficult for you to refine it if you think it is
necessary so it can fit on my system too.

of course, I always welcome whoever keep original class of book
authors expect, i.e. class HttpRequest
and its overloaded operator << in
void send(string soapMsg) {sock_ << soapMsg;}
to complete the fix
Eric
----------------------------------------------------------------------------------------------------------
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top