Boost.Python을 사용하여 Python에 C++ 클래스를 노출하려고합니다. 다음은 내가하려고하는 것의 단순한 버전입니다 :참조에 의한 Boost.Python 호출 : TypeError : C++에 대해 to_python (by-value) 변환기가 없습니다.
나는 boost :: noncopyable에서 파생 된 클래스 A와 인수로 A에 대한 참조를 취하는 메서드로 두 번째 클래스 B를가집니다.
test.py :
import SomeModule
class BDerived(SomeModule.B):
def do_something(self, a):
pass
및 확장을 호출
/* Wrapper for B, so B can be extended in python */
struct BWrap : public B, wrapper<B> {
void do_something(A &a) {
if (override do_something = this->get_override("do_something")) {
do_something(a);
return;
}
else {
B::do_something(a);
}
}
void default_do_something(A& a) { this->B::do_something(a); }
};
BOOST_PYTHON_MODULE(SomeModule) {
class_<A, boost::noncopyable>("A");
class_<BWrap, boost::noncopyable>("B")
.def("do_something", &B::do_something, &BWrap::default_do_something)
;
}
나는 이런 식으로 파이썬에서 B를 확장 다음과 같이 내가 클래스를 노출하고있어
class A : boost::noncopyable { /*...*/ };
class B {
public:
virtual void do_something(A& a) {
/*...*/
}
};
B like :
,210그러나이 오류 메시지가 발생합니다 boost::noncopyable
에서 파생되지 않은 코드는 오류없이 실행되지만 do_something(A& a)
에서 인수 A는이 전달 비록 함수를 호출하는 동안 복사됩니다
TypeError: No to_python (by-value) converter found for C++ type: A
A
경우 참조로. 그러나 A
에 복사 불가능한 요구 사항을 제거하는 것은 이유가 있기 때문에 옵션이 아닙니다.
문제를 해결하는 방법에 대한 제안이 있으십니까?
감사합니다.
여기에 방문하는 사람들을 위해 : Boost 1.60.0에 최근 버그가 있습니다.이 버그는 Boost 1.61.0에서 수정해야합니다. https://github.com/boostorg/python/pull/59도 참조하십시오. –
@KennethHoste 정말 고마워 !!! 주위에 실수하지 않으면 몇 일 동안 나를 구해 줬어 !! 그래서 나는이 작은 설명을 발견했다! :) – Mangostaniko