3

Boost.Python lib を使用して抽象クラスを Python に公開する際に問題があります。1_53_0 ブーストと Python 33 を使用しています。

この問題に関連する同様のスレッドがあります。( C++ によって呼び出されるように、Python で C++ クラスを実装するにはどうすればよいですか? ) 私はeudoxos の応答に従っていました。彼は、文字列型を返すメソッドを持つ抽象クラス Base のラッパーを作成します。

私は似たようなことをしていますが、常にコンパイルエラーが発生します:

  • エラー 1 エラー C2668: 'std::basic_string<_Elem,_Traits,_Ax>::basic_string': オーバーロードされた関数 d:\temp\example\example.h へのあいまいな呼び出し 20
  • 8 IntelliSense: "boost::python::detail::method_result" から "std::string" への複数のユーザー定義変換が適用されます: d:\temp\example\example.h 20

上記のエラーは、次の行に関連しています。

return this->get_override("getName")();

以下に示す私の例から:

#include <string>
#include "boost/python.hpp"

class Person {

public:

    virtual std::string getName() { return "Base"; };

    virtual void setName(std::string name) {};

};

class PersonWrap : public Person, public boost::python::wrapper<Person>
{

public:

    std::string getName()
    {
        return this->get_override("getName")();
    }

    void setName(std::string name)
    {
        this->get_override("setName")();
    }
};

class Student : public Person {

public:

    std::string getName() { return myName; };

    void setName(std::string name) { myName = name; };

    std::string myName;
};

BOOST_PYTHON_MODULE(example)
{
    boost::python::class_<PersonWrap, boost::noncopyable>("Person")
        .def("getName", (&Person::getName))
        .def("setName", (&Person::setName))
    ;

    boost::python::class_<Student, boost::python::bases<Person>>("Student")
        .def("getName", (&Student::getName))
        .def("setName", (&Student::setName))
    ;
}

コメントをお待ちしております。

4

1 に答える 1

2

この問題の解決策を見つけました。次のように機能します。

std::string getName()
{
    //return this->get_override("getName")();
    return boost::python::call<std::string>(this->get_override("getName")());
}

ただし、boost python ドキュメントによると、これは MSVC6/7 にのみ使用する必要があります。VS2010 (MSVC 10.0) を使用しているため、これは私の場合ではありません。

于 2013-07-04T10:43:25.927 に答える