2010-05-13 15 views
15

को बढ़ावा देने के लिए `__str__` विधि जोड़ने के दौरान समस्याएं बनाएं I बूस्ट पायथन के साथ थोड़ा सा खेलना शुरू कर दिया है और एक समस्या में भाग गया है। मैंने एक सी ++ वर्ग को पायथन में बेनकाब करने की कोशिश की जिसमें कोई समस्या नहीं आई। लेकिन मुझे बिल्डिंग त्रुटियों के बिना कक्षा के लिए __str__ कार्यक्षमता को लागू करने के लिए प्रबंधन प्रतीत नहीं होता है, मुझे समझ में नहीं आता है।पायथन सी ++ कक्षा

मैं बूस्टप्रो द्वारा बूस्ट 1_42 प्रीबिल्ड का उपयोग कर रहा हूं। मैं cmake और बनाम 2010 संकलक का उपयोग कर पुस्तकालय का निर्माण।

मेरे पास एक बहुत ही सरल सेटअप है। हैडर फ़ाइल (tutorial.h) ऐसा दिखाई देता है:

#include <iostream> 
namespace TestBoostPython{ 
    class TestClass { 
     private: 
      double m_x; 
     public: 
      TestClass(double x); 
      double Get_x() const; 
      void Set_x(double x); 
    }; 
    std::ostream &operator<<(std::ostream &ostr, const TestClass &ts); 
}; 

और इसी cpp फ़ाइल लगता है:

#include <boost/python.hpp> 
#include "tutorial.h" 

using namespace TestBoostPython; 

TestClass::TestClass(double x) 
{ 
    m_x = x; 
} 

double TestClass::Get_x() const 
{ 
    return m_x; 
} 
void TestClass::Set_x(double x) 
{ 
    m_x = x; 
} 

std::ostream &operator<<(std::ostream &ostr, const TestClass &ts) 
{ 
    ostr << ts.Get_x() << "\n"; 
    return ostr; 
} 

BOOST_PYTHON_MODULE(testme) 
{ 
using namespace boost::python; 
class_<TestClass>("TestClass", init<double>()) 
    .add_property("x", &TestClass::Get_x, &TestClass::Set_x) 
    .def(str(self)) 
    ; 
} 

CMakeLists.txt ऐसा दिखाई देता है:

CMAKE_MINIMUM_REQUIRED(VERSION 2.8) 

project (testme) 

FIND_PACKAGE(Boost REQUIRED) 
FIND_PACKAGE(Boost COMPONENTS python REQUIRED) 
FIND_PACKAGE(PythonLibs REQUIRED) 

set(Boost_USE_STATIC_LIBS OFF) 
set(Boost_USE_MULTITHREAD ON) 

INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIRS}) 
INCLUDE_DIRECTORIES (${PYTHON_INCLUDE_PATH}) 

add_library(testme SHARED tutorial.cpp) 
target_link_libraries(testme ${Boost_PYTHON_LIBRARY}) 
target_link_libraries(testme ${PYTHON_LIBRARY} 

Compiling... 
tutorial.cpp 
    C:\Program Files (x86)\boost\boost_1_42\boost/python/def_visitor.hpp(31) : error C2780: 'void boost::python::api::object_operators::visit(ClassT &,const char *,const boost::python::detail::def_helper &) const' : expects 3 arguments - 1 provided 
    with 
    [ 
     U=boost::python::api::object 
    ] 
    C:\Program Files (x86)\boost\boost_1_42\boost/python/object_core.hpp(203) : see declaration of 'boost::python::api::object_operators::visit' 
    with 
    [ 
     U=boost::python::api::object 
    ] 
    C:\Program Files (x86)\boost\boost_1_42\boost/python/def_visitor.hpp(67) : see reference to function template instantiation 'void boost::python::def_visitor_access::visit,classT>(const V &,classT &)' being compiled 
    with 
    [ 
     DerivedVisitor=boost::python::api::object, 
     classT=boost::python::class_, 
     V=boost::python::def_visitor 
    ] 
    C:\Program Files (x86)\boost\boost_1_42\boost/python/class.hpp(225) : see reference to function template instantiation 'void boost::python::def_visitor::visit>(classT &) const' being compiled 
    with 
    [ 
     DerivedVisitor=boost::python::api::object, 
     W=TestBoostPython::TestClass, 
     classT=boost::python::class_ 
    ] 
    .\tutorial.cpp(29) : see reference to function template instantiation 'boost::python::class_ &boost::python::class_::def(const boost::python::def_visitor &)' being compiled 
    with 
    [ 
     W=TestBoostPython::TestClass, 
     U=boost::python::api::object, 
     DerivedVisitor=boost::python::api::object 
    ] 
:

निर्माण त्रुटि मैं निम्नलिखित है

क्या किसी को भी wrrong क्या हुआ पर कोई विचार है? यदि मैं रैपर कोड से .def (str (self)) भाग को हटा देता हूं, तो सबकुछ ठीक से संकलित होता है और कक्षा पायथन से उपयोग योग्य होती है। मैं सहायता के लिए बहुत अच्छा होगा।

धन्यवाद, रिकार्ड

संपादित करें: एक स्थिरांक

+0

अच्छा! मैंने शुरुआती रूप से सावधानी से नहीं देखा और ऑपरेटर को परिभाषित किया << कक्षा में खुद के नाम के बजाए कक्षा में, जिसने इसे पायथन में एक प्रिंट (myObj) कॉल करने के लिए काम करने में सभी अंतर किए। अच्छा काम रिकार्ड। हालांकि मैंने देखा कि मुझे अभी भी अपनी ऑब्जेक्ट को प्रस्तुत करने के लिए प्रिंट को स्पष्ट रूप से प्रिंट करने की आवश्यकता है क्योंकि मैं पाइथन में चाहता हूं। तो मैं बस अपना वस्तु दर्ज यह परिणाम देता है अगर मैं प्रकार (myObj) कहा जाता है, पायथन के लिए डिफ़ॉल्ट व्यवहार हो सकता है, शायद मैं हालांकि आर या Matlab में अनुभव के साथ घुलमिल जाएं रहा हूँ। – jxramos

उत्तर

24

मैं हाल ही में इस समस्या का सामना करना भूल गया;

.def(str(self)) 

तो यह है कि यह हो जाता है:: समाधान है कि काम को स्पष्ट रूप से str और self इस लाइन पर हल करने के लिए था

.def(self_ns::str(self_ns::self)) 

मैं नहीं जानता कि क्यों यह आवश्यक है, (के बारे में कुछ जानते हुए भी अधिभार संकल्प उलझन है कि बढ़ावा अजगर में पर चला जाता है, यह शायद कुछ नहीं है ...), लेकिन यह मेरे लिए काम किया :)

+2

अद्भुत! बहुत बहुत धन्यवाद। मुझे बूस्ट :: पायथन पसंद है, लेकिन जब सामान इस तरह से खराब हो जाता है तो मुझे लगता है कि ऑब्जेक्ट को पाइथन सी-एपीआई में हाथ से लपेटना आसान हो सकता है। मुझे अपने आप को यह समाधान कभी नहीं मिला होगा। एक बार फिर धन्यवाद। – Rickard

+0

यह अभी भी मेरे लिए आज भी काम करता है। मुझे आश्चर्य है कि यह लंबे समय पहले तय नहीं किया जाना चाहिए था ...? – varantir

+0

एक बूस्ट :: पायथन :: स्ट्र, और एक बूस्ट :: पायथन :: self_ns :: str, जो बहुत अलग चीजें हैं। यदि आपका कोड 'का उपयोग कर गया है को बढ़ावा देने :: python' (कई के रूप में शायद हो जाएगा), संकलक पूर्व, जो जोर से यह confuses मिलेगा क्योंकि यह आवश्यक है। – stochastic

10

मैं एक ही बात में फंस गयी। इस लाइन को जोड़ने (स्ट्र और स्वयं योग्यता के बजाय) भी काम करता है:

using self_ns::str; 
संबंधित मुद्दे