On Sunday, 29 March 2020 at 01:50:24 UTC, evilrat wrote:
...

Same here, STL bindings is not yet finished. If you don't need that method specifically, just replace it with a dummy. Or make your own bindings.

Thanks, dummy placeholder works. But there is a new problem on Windows, let's say there are two classes in C++:

    class Y {
        ...
    };
    class X {
    public:
        void call(Y const * y) const;
    };

on Windows, the library file (compiled with Visual C++) contains an entry like this:

16C 00000020 SECT4 notype () External | ?call@X@@QBEXPBVY@@@Z (public: void __thiscall X::call(class Y const *)const )

Then I declare it in D like this:

    extern(C++) {
        class Y {
            ...
        }
        class X {
            final void call(const(Y) y) const;
        }
    }

The object file for this D code (compiled with ldc2) will contain an entry like this:

0A7 00000000 UNDEF notype External | ?call@X@@QBEXQBVY@@@Z (public: void __thiscall X::call(class Y const * const)const )

So there is a subtle difference in the signature, and the linker refuses to resolve the symbol.

I tried "const Y y", "const(Y*) y", and "ref const(Y) y", but none of them manages to match the library file entry.

(This problem somehow does not appear on Linux where the library file is compiled with gcc, though)

So what do I need to declare in the D file for it to match the library entry? Thanks!

Reply via email to