首页 > 解决方案 > Emscripten:创建包装器以允许子类时出现“分配抽象类类型的对象”错误

问题描述

考虑以下人为设计的示例:

class IBar {
    void qux() = 0;
};

class IFoo {
    void execute(const IBar &bar) = 0;
};

struct FooWrapper : public wrapper<IFoo> {
    EMSCRIPTEN_WRAPPER(FooWrapper);

    void execute(const IBar &bar) override {
        return call<void>("execute", bar);
    }
};

EMSCRIPTEN_BINDINGS(IFoo) {
    class_<IFoo>("IFoo")
        .function("execute", &IFoo::execute, allow_raw_pointers(), pure_virtual())
        .allow_subclass<FooWrapper>("FooWrapper");
}

如果我尝试编译此代码,则会收到错误消息,因为我正在尝试“分配抽象类类型的对象IBar”。

/emsdk/upstream/emscripten/cache/sysroot/include/emscripten/wire.h:348:28: error: allocating an object of abstract class type 'IBar'
                return new T(v);

显然IBar是抽象的,但这无关紧要,因为execute它引用了一个IBar对象。似乎出于某种未知原因emscripten::call试图实例化。IBar

在我的实际代码中,我无法更改IFoo::execute.

有谁知道这个问题的解决方法?

标签: c++webassemblyemscriptenembind

解决方案


推荐阅读