Thread overview
Why is a cast needed here?
Nov 25, 2006
Dave
Nov 26, 2006
Daniel Giddings
Nov 26, 2006
Chris Miller
Nov 26, 2006
Dave
November 25, 2006
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!
November 26, 2006
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!


November 26, 2006
> "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!

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.
November 26, 2006
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.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@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
}