On Wednesday, 6 February 2019 at 02:36:33 UTC, evilrat wrote:
No surprises here, D can only inherit from virtual C++ classes
and that message says exactly that(class must have at least one
virtual method).
This someclass looks for me as just a strange design decision,
if it's not just a POD data object (i.e. simple struct that is
declared as a class) then normally the class will have at least
virtual destructor to allow proper destruction.
In case it is really just the POD class you can declare it as
struct, add it as a member and 'alias this'[1] it to provide
sort-of-inheritance chain (i.e. it will be implicitly accepted
using that alias part)
extern(C++)
struct someclass {}
extern(C++)
class otherclass {
someclass baseclass; // <- "inherited" data must go
before other members to preserve data layout
alias baseclass this; // <- pseudo inheritance alias
...
}
Though in some cases depending on semantic it is possible that
it might not work as expected. (Though I can't remeber any)
If however otherclass is just a POD as well then you should
turn it into a struct as well, same for all descendants...
Thanks for the trick, I'll try it and see how it goes.
Since the class have nothing in them, I just made some "alias
otherclass = baseclass" statements and it seems it is working (at
least it's compiling, have to really test that too). From what
I saw about the code is that those types are just "placeholders"
because they aren't used directly by the API.
Just in case, there is few tools for generating bindings
available - dstep(AFAIK no C++)[2], dpp[3], gentool[4], and
more info on the wiki[5].
I know about those tools, but usually (and sadly enough) they
either just ignore any extern(C++) or don't fully work on
Windows. I didn't test gentool yet, so I might have more luck
with it, but for the other ones they didn't provide full
translation of the headers yet.