Чистый виртуальный оператор перегрузки в оболочке Boost.Python

Я пишу класс-оболочку для абстрактного базового класса, базовый класс имеет пару чисто виртуальных методов и перегруженный оператор, если я компилирую с перегруженным оператором, я получаю следующую ошибку:

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

Редактировать: я даже не уверен, что это правильный способ сделать это, я не видел подобных примеров в документах.


person iabdalkader    schedule 12.06.2012    source источник


Ответы (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);
}

Таким образом, вы на самом деле не реализуете чистый виртуальный объект из базы, а скорее определяете новую функцию.

person jrok    schedule 12.06.2012
comment
Это была первая проблема, другая заключалась в том, что одна из функций была постоянным членом, вы тоже заставили меня понять это, так что большое вам спасибо :) - person iabdalkader; 12.06.2012