【问题标题】:Pure virtual overload operator in Boost.Python wrapperBoost.Python 包装器中的纯虚拟重载运算符
【发布时间】:2012-06-12 19:25:40
【问题描述】:

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

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==))
;

编辑:我什至不确定这是执行此操作的正确方法,我在文档中没有看到任何类似的示例。

【问题讨论】:

    标签: c++ boost boost-python


    【解决方案1】:

    你有两个不同的签名:

    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);
    }
    

    因此,您实际上并没有从基础实现纯虚拟,而是定义了一个新函数。

    【讨论】:

    • 这是第一个问题,另一个是其中一个函数是一个常量成员,你让我也意识到了这一点,所以非常感谢你:)
    猜你喜欢
    • 2019-10-21
    • 1970-01-01
    • 2011-09-08
    • 2012-12-02
    • 2021-11-12
    • 2020-09-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多