Re: how to include a c struct in C++ namespace
On Mar 25, 4:43 am, ethan.li...@gmail.com wrote:
I am trying to wrap c functions with some exception handling,
for example, wrap the socket bind in A::Bind
a.h
namespace A {
int Bind(int fd, struct sockaddr *addr, socklen_t addrlen) throw
(inet_error);
}
a.cc
namespace A {
int Bind(int fd, struct sockaddr *addr, socklen_t addrlen) throw
(inet_error) {
/* if error, throw; otherwise return; */
}
}
The problem is this generates link error,
error: reference to \u2018sockaddr\u2019 is ambiguous....
it seems the compiler think I define a new struct, with the
same name "sockaddr" in name space A, I tried to remove the
struct keyword, and it wouldn't compile.
Did you include the header which defines sockaddr (sys/socket.h
under Unix)? If not, without the struct, the compiler doesn't
know what it is, and with the struct, you're declaring a new
struct in the function declaration---the struct itself is in
namespace A, but the scope (and thus the visibility) is just the
declaration, so when you provide the definition (a second
declaration), there is a conflict: because sockaddr isn't in
scope, the compiler can't see it, and so it must be a
declaration of a new type, but when the compiler goes to insert
this new type in namespace A, it finds that there is already a
type with the same name.
in A, I have to reference to the global C struct, sockaddr etc.
in main(), I have to use those global C structs together with
functions I defined in A.
I am a bit confused here, I didn't define any new struct in A.
If you didn't include the necessary headers, you did.
so I guess my question is, is there a simple and clean way to
use a C struct within a user defined namespace in C++?
Well, since it is C, it's never really clean:-). But I have no
problems in my code, provided I've included the correct headers.
If you've included <sys/socket.h> before any use of sockaddr,
and are still having problems, please post a complete example of
what you're feeding the compiler.
--
James Kanze (GABI Software) email:james.kanze@gmail.com
Conseils en informatique orient=E9e objet/
Beratung in objektorientierter Datenverarbeitung
9 place S=E9mard, 78210 St.-Cyr-l'=C9cole, France, +33 (0)1 30 23 00 34