我正在为抽象基类编写包装器类,该基类具有几个纯虚拟方法和一个重载运算符,如果使用重载运算符进行编译,则会出现以下错误:

cannot allocate an object of abstract type


即使我在包装器类中实现了重载运算符,Boost.Python仍以某种方式坚持认为未实现它,有什么线索吗?

这是我的代码如下所示:

//abstract base class
class Test
{
    public:
    virtual void start() = 0;
    virtual void stop() = 0;
    virtual bool operator==(const Test rhs) = 0;
};

//wrapper class
struct TestWrapper: Test, wrapper<Test>
{
    public:
    void start()
    {
        this->get_override("start")();
    }
    void stop()
    {
        this->get_override("stop")();
    }

    bool operator==(const Test& rhs)
    {
        return this->get_override("operator==")(rhs);
    }

};

//boost python module
class_<TestWrapper, boost::noncopyable>("Test")
    .def("start", pure_virtual(&Test::start) )
    .def("stop", pure_virtual(&Test::stop) )
    .def("operator==", pure_virtual(&Test::operator==))
;


编辑:我什至不知道这是正确的方法,我还没有在文档中看到这样的例子。

最佳答案

您有两个不同的签名:

class Test
{
    public:
    virtual void start() = 0;
    virtual void stop() = 0;
    virtual bool operator==(const Test rhs) = 0;  // takes rhs by value
};


在派生类中:

bool operator==(const Test& rhs)   // takes rhs by reference
{
    return this->get_override("operator==")(rhs);
}


因此,您实际上并不是从基础上实现纯虚拟,而是定义了一个新功能。

关于c++ - Boost.Python包装器中的纯虚拟重载运算符,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11003452/

10-09 23:02