0

抽象基本クラスのラッパー クラスを作成しています。基本クラスには、いくつかの純粋仮想メソッドとオーバーロードされた演算子があり、オーバーロードされた演算子でコンパイルすると、次のエラーが発生します。

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

編集:これがこれを行う正しい方法であるかどうかさえわかりません。ドキュメントでこのような例を見たことがありません。

4

1 に答える 1

3

2 つの異なる署名があります。

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

したがって、実際にはベースから純粋な仮想を実装するのではなく、新しい関数を定義しています。

于 2012-06-12T19:29:26.297 に答える