Derived type

WebFreak001 d.forum at webfreak.org
Tue Mar 30 14:45:12 UTC 2021


On Tuesday, 30 March 2021 at 13:28:55 UTC, novice3 wrote:
> Hello.
>
> When i adapt C code, i see new type creation:
>   typedef void* Xobj;
>
> Or code like this:
>   struct _Xobj;
>   typedef struct _Xobj *Xobj;
>
>
> I want create derived type in D, found std.typecons.Typedef 
> template, and write:
>   alias Xobj = Typedef!(void*, (void*).init);
>
> But compiler use long type name in error messages, like this:
>
>   Error: function test6.foo(Typedef!(void*, null, null) obj) is 
> not callable using argument types (void*)
>
>   cannot pass argument bad of type void* to parameter 
> Typedef!(void*, null, null) obj
>
> This messages dont help me understand, which type should i use.
> What i should change?
> Or Typedef template should be changes?
> Any Typedef alternatives?

The typedef in C in D is just an alias:

```
alias Xobj = void*;
```

Xobj can then be used interchangeably with void*, so all void* 
arguments accept Xobj and all Xobj arguments accept void*.

If you want a type-safe alias that makes all void* arguments 
accept Xobj but not Xobj arguments to accept void* you can use 
`Typedef` like you linked. However using this language built-in 
feature is much simpler and cheaper in terms of resource usage 
and compile time + always results in the fastest code: (there is 
no conversions at all)

```
enum Xobj : void*;
```

This allows explicit conversion in both ways using cast, but only 
allows implicit conversion from Xobj to void*, not from void* to 
Xobj:

```
void* x = someValue;
Xobj y = cast(Xobj)x; // ok
x = y; // ok
y = x; // error (need explicit cast)
```


More information about the Digitalmars-d-learn mailing list