On Mar 24, 11:14 pm, Victor Bazarov <v.Abaza...@comAcast.net> wrote:
ethan.li...@gmail.com wrote:
Hi,
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 ?sockaddr? is ambiguous....
it seems the compiler think I define a new struct, with the same name
"sockaddr" in name space A, I tr
ied to remove the struct keyword, and it wouldn't compile.
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.
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++?
You can always qualify the type-id from outside of the namespace:
namespace A {
int Bind(int, ::sockaddr*, ::socklen_t) throw(ine_error);
}
That should disambiguate the names of the types.
V
--
Please remove capital 'A's when replying by e-mail
I do not respond to top-posted replies, please don't ask
hi, thank you very much for the reply. at one moment, I thought I was
enlightened,
the program compiled and linked well using gcc 4.3.2 on Fedora 10. in
the main file, I just say "using namespace A", then I can use my
wrapper function without causing any ambiguity on those C structs.
but today I tried to compile in cygwin gcc 3.4.4
it complained about this line: (enclosed in namespace A, as above)
int Connect(int sockfd, const ::sockaddr_in *serv_addr, socklen_t len)
throw (inet_error);
"error: expected unqualified-id before * token".
now I am confused again. isn't this supposed to be a valid syntax/
semantic rule of C++?
Uh... Do you think it might be worth your while to upgrade the compiler
the error. Did you remember to include the definition of 'sockaddr_in'