extern(C++) template problem

Nicholas Wilson iamthewilsonator at hotmail.com
Wed May 23 10:14:24 UTC 2018


On Wednesday, 23 May 2018 at 07:09:40 UTC, Manu wrote:
> C++:
> ---------------------------------------
> class C {};
>
> template <typename T>
> void create(T** x);
> ---------------------------------------
>
> D:
> ---------------------------------------
> extern(C++) class C {}
>
> void create(T)(T* x);
> ---------------------------------------
>
> Trouble is; in CPP, the template mangles as a C, but in D, the 
> class mangles as C*... so the mangling doesn't match.
>
> `template<typename Class>` is an unbelievably common occurrence 
> in C++... but how do we express a signature that mangles 
> correctly in D? D always mangles `Class` as `Class*`... which 
> changes the signature.
>
>>_<

I believe you are looking for

> extern(C++,class) struct C {}
>
> void create(T)(T** x);

or

> extern(C++,struct) class C {}
>
> void create(T)(T** x);

I can't remember which is the one you want here (still half 
asleep from jet lag).

in the case of e.g.  extern(C++,struct) class C {}
this tells the D compiler that is should mangle it as though it 
is a struct (as it is declared in C++ as a struct) but it 
actually has a vtable and behaves like a class from the D school 
of thought. Vice versa for extern(C++,class) struct C {}


More information about the Digitalmars-d mailing list