私は次のクラスを持っています:
#include <array>
template<unsigned short D>
class Point {
private:
std::array<float, D> coordinates;
public:
Point() { for(int i=D-1; i>=0; --i) coordinates[i] = 0.0; }
Point(const Point& rhs) = default;
Point& operator=(const Point& rhs) = default;
~Point() = default;
float& get_ref(const unsigned short dimension)
{ return coordinates[dimension-1]; }
};
私はそれを次のようにラップしようとしています:
#include <boost/python.hpp>
BOOST_PYTHON_MODULE(fernpy) {
using namespace boost::python;
class_< Point<2> >("point")
.def("__call__", &Point<2>::get_ref, return_internal_reference<>());
}
私はgcc-4.7を使用してブースト1.48、Python-2.7をFedora17でコンパイルしています。すべてのコードはtestpy.cppというファイルです。私はこれらのコマンドを使用してコンパイルしています:
g++ -std=c++11 -g -fPIC -I/usr/include/python2.7 -c testpy.cpp
g++ -shared -g -lpython2.7 -lboost_python -o libfern.so testpy.o
コンパイラは大量のブースト内部エラーを返しますが、ここに投稿するには多すぎます。この抜粋がその核心のようです。その前に「必須」と後の「メモ」がたくさんあります。
/usr/include/boost/python/object/make_instance.hpp:27:9: error: no matching function for call to ‘assertion_failed(mpl_::failed************ boost::mpl::or_<boost::is_class<float>, boost::is_union<float>, mpl_::bool_<false>, mpl_::bool_<false>, mpl_::bool_<false> >::************)’
get_refからプレーンフロートを返し、ラッパーの.def行からreturn_internal_reference <>()引数を削除すると、問題なく機能します。私は別のより複雑なクラステンプレートで同じことをしているので、それは奇妙です、そしてそれはそこでもうまく機能します。私はこれにほぼ丸一日グーグルして頭をぶつけてきました。一体何が起こっているのか誰かが知っていますか?
アップデート:
私はPythonの「getitem」と「setitem」の特別なメソッドを使用することになりました。これはこのリンクです。このリンクは、アクセス関数の静的ラッパーを使用して気の利いた構造体テンプレートを定義する方法を示しているため、元のC++クラスへのインターフェイスをいじる必要はありません。