www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Why is a cast needed here?

reply Dave <Dave_member pathlink.com> writes:
import std.socket;

void main()
{
//Socket s = new Socket(AddressFamily.INET,SocketType.STREAM,ProtocolType.TCP);
   Socket s = new Socket(cast(AddressFamily)AddressFamily.INET,SocketType.STREAM,ProtocolType.TCP);
}

Why is the 'cast(AddressFamily)' needed?

W/o the cast:

t.d(5): constructor std.socket.Socket.this () does not match parameter types 
(int,SocketType,ProtocolType)
t.d(5): Error: cannot implicitly convert expression (2) of type int to
AddressFamily
t.d(5): Error: cannot implicitly convert expression (6) of type ProtocolType to
char[]
t.d(5): Error: cannot cast int to char[]

Thanks!
Nov 25 2006
parent reply "Daniel Giddings" <daniel.giddings gmail.com> writes:
Looks like its a bug in 0.175, I've just needed to add the same casts to my 
code. It's a compiler issue rather than a lib issue, as the SocketType and 
ProtocolType are declared as enums in the same way, but don't need the cast.

:-) Dan

"Dave" <Dave_member pathlink.com> wrote in message 
news:eka11i$15v4$1 digitaldaemon.com...
 import std.socket;

 void main()
 {
 //Socket s = new 
 Socket(AddressFamily.INET,SocketType.STREAM,ProtocolType.TCP);
   Socket s = new 
 Socket(cast(AddressFamily)AddressFamily.INET,SocketType.STREAM,ProtocolType.TCP);
 }

 Why is the 'cast(AddressFamily)' needed?

 W/o the cast:

 t.d(5): constructor std.socket.Socket.this () does not match parameter 
 types (int,SocketType,ProtocolType)
 t.d(5): Error: cannot implicitly convert expression (2) of type int to 
 AddressFamily
 t.d(5): Error: cannot implicitly convert expression (6) of type 
 ProtocolType to char[]
 t.d(5): Error: cannot cast int to char[]

 Thanks! 
Nov 26 2006
parent reply "Chris Miller" <chris dprogramming.com> writes:
 "Dave" <Dave_member pathlink.com> wrote in message
 news:eka11i$15v4$1 digitaldaemon.com...
 import std.socket;

 void main()
 {
 //Socket s =3D new
 Socket(AddressFamily.INET,SocketType.STREAM,ProtocolType.TCP);
   Socket s =3D new
 Socket(cast(AddressFamily)AddressFamily.INET,SocketType.STREAM,Protoc=
olType.TCP);
 }

 Why is the 'cast(AddressFamily)' needed?

 W/o the cast:

 t.d(5): constructor std.socket.Socket.this () does not match paramete=
r
 types (int,SocketType,ProtocolType)
 t.d(5): Error: cannot implicitly convert expression (2) of type int t=
o
 AddressFamily
 t.d(5): Error: cannot implicitly convert expression (6) of type
 ProtocolType to char[]
 t.d(5): Error: cannot cast int to char[]

 Thanks!
On Sun, 26 Nov 2006 05:25:33 -0500, Daniel Giddings = <daniel.giddings gmail.com> wrote:
 Looks like its a bug in 0.175, I've just needed to add the same casts =
to =
 my
 code. It's a compiler issue rather than a lib issue, as the SocketType=
=
 and
 ProtocolType are declared as enums in the same way, but don't need the=
=
 cast.

 :-) Dan
I run into this issue with other code as well. I think it has to do with= = different enums used by overloaded functions.
Nov 26 2006
parent Dave <Dave_member pathlink.com> writes:
Chris Miller wrote:
 "Dave" <Dave_member pathlink.com> wrote in message
 news:eka11i$15v4$1 digitaldaemon.com...
 import std.socket;

 void main()
 {
 //Socket s = new
 Socket(AddressFamily.INET,SocketType.STREAM,ProtocolType.TCP);
   Socket s = new
 Socket(cast(AddressFamily)AddressFamily.INET,SocketType.STREA
,ProtocolType.TCP); 

 }

 Why is the 'cast(AddressFamily)' needed?

 W/o the cast:

 t.d(5): constructor std.socket.Socket.this () does not match parameter
 types (int,SocketType,ProtocolType)
 t.d(5): Error: cannot implicitly convert expression (2) of type int to
 AddressFamily
 t.d(5): Error: cannot implicitly convert expression (6) of type
 ProtocolType to char[]
 t.d(5): Error: cannot cast int to char[]

 Thanks!
On Sun, 26 Nov 2006 05:25:33 -0500, Daniel Giddings <daniel.giddings gmail.com> wrote:
 Looks like its a bug in 0.175, I've just needed to add the same casts 
 to my
 code. It's a compiler issue rather than a lib issue, as the SocketType 
 and
 ProtocolType are declared as enums in the same way, but don't need the 
 cast.

 :-) Dan
I run into this issue with other code as well. I think it has to do with different enums used by overloaded functions.
Here's a minimal test-case. I'll formalize it w/ a bug report. void main() { // foo f = new foo(cast(AddressFamily)AddressFamily.INET); foo f = new foo(AddressFamily.INET); } class foo { this(AddressFamily f) { } } // from std.c.linux.socket enum: int { AF_INET = 2 } // from std.c.linux.socket struct sockaddr_in { short sin_family = AF_INET; } // from std.socket enum AddressFamily: int { INET = AF_INET }
Nov 26 2006