Why is a cast needed here?

Dave Dave_member at pathlink.com
Sun Nov 26 11:06:03 PST 2006


Chris Miller wrote:
>> "Dave" <Dave_member at pathlink.com> wrote in message
>> news:eka11i$15v4$1 at 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!
> 
> On Sun, 26 Nov 2006 05:25:33 -0500, Daniel Giddings 
> <daniel.giddings at 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
}



More information about the Digitalmars-d-learn mailing list