2011-03-17 1 views
17

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에 복사 불가능한 요구 사항을 제거하는 것은 이유가 있기 때문에 옵션이 아닙니다.

문제를 해결하는 방법에 대한 제안이 있으십니까?

감사합니다.

+1

여기에 방문하는 사람들을 위해 : Boost 1.60.0에 최근 버그가 있습니다.이 버그는 Boost 1.61.0에서 수정해야합니다. https://github.com/boostorg/python/pull/59도 참조하십시오. –

+1

@KennethHoste 정말 고마워 !!! 주위에 실수하지 않으면 몇 일 동안 나를 구해 줬어 !! 그래서 나는이 작은 설명을 발견했다! :) – Mangostaniko

답변

15

변경 B.do_something(a);에서 B.do_something(boost::ref(a));으로 변경하십시오.

부스트 설명서에서 Calling Python Functions and Methods을 참조하십시오.

+0

고마워요! 너는 내게 올바른 힌트를 주었다. 래퍼 클래스에서 그것을 바꿔야했지만'do_something (boost :: ref (a));'를 호출하고'B.do_something (a);'을 호출 할 때가 아닙니다. 인터넷 검색의 시간조차 내게 그 힌트를주지 못했다고 믿을 수 없습니다. 다시 한 번 감사드립니다! – Kai

관련 문제