gpt4 book ai didi

python - 将 `__str__` 方法添加到 Boost Python C++ 类时的构建问题

转载 作者:IT老高 更新时间:2023-10-28 21:08:01 29 4
gpt4 key购买 nike

我已经开始尝试使用 boost python 并遇到了一个问题。我试图将一个 C++ 类暴露给没有问题的 python。但我似乎无法为类实现 __str__ 功能而不会出现我不理解的构建错误。

我正在使用 boostpro 的 boost 1_42 prebuild。我使用 cmake 和 vs2010 编译器构建库。

我有一个非常简单的设置。头文件 (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
]

有人知道出了什么问题吗?如果我从包装器代码中删除 .def(str(self)) 部分,一切都可以正常编译,并且该类可以从 python 中使用。非常感谢您的帮助。

谢谢你,里卡德

编辑:忘记了一个常量

最佳答案

我最近遇到了这个问题;有效的解决方案是明确解决这一行的 strself :

.def(str(self))

这样就变成了:

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

我不知道为什么这是必要的,(知道一些在 boost python 中发生的重载解决复杂性,它可能在那里......)但它对我有用:)

关于python - 将 `__str__` 方法添加到 Boost Python C++ 类时的构建问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2828903/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com