Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Boost.Python包装中的纯虚拟重载运算符_C++_Boost_Boost Python - Fatal编程技术网

C++ Boost.Python包装中的纯虚拟重载运算符

C++ Boost.Python包装中的纯虚拟重载运算符,c++,boost,boost-python,C++,Boost,Boost Python,我正在为一个抽象基类编写一个包装类,基类有两个纯虚方法和一个重载运算符,如果使用重载运算符编译,则会出现以下错误: cannot allocate an object of abstract type 尽管我在包装器类中实现了重载运算符,但是Boost.Python仍然坚持认为它没有实现,有什么线索吗 这就是我的代码的样子: //abstract base class class Test { public: virtual void start() = 0; virt

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

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==))
;
//抽象基类
课堂测试
{
公众:
虚拟void start()=0;
虚空停止()=0;
虚拟布尔运算符==(常数测试rhs)=0;
};
//包装类
结构TestWrapper:测试,包装
{
公众:
void start()
{
这个->获取覆盖(“开始”)();
}
无效停止()
{
此->获取覆盖(“停止”)();
}
布尔运算符==(常量测试和rhs)
{
返回此->获取覆盖(“运算符==”)(rhs);
}
};
//boostpython模块
类别("测试")
.def(“开始”,纯虚拟(&测试::开始))
.def(“停止”,纯虚拟(&测试::停止))
.def(“运算符==”,纯虚拟(&Test::运算符==))
;

编辑:我甚至不确定这样做是否正确,我在文档中没有看到任何类似的示例。

您有两个不同的签名:

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

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

这是第一个问题,另一个问题是其中一个函数是常量成员,您也让我意识到了这一点,非常感谢:)