将C ++枚举类暴露给Python代码时出错

时间:2019-02-01 04:50:46

标签: python boost-python

我必须将C ++枚举类公开给python。 我已经检查了一些示例,但是所有示例都是关于C风格的enum类型的。但是,我需要使用enum类。有什么建议吗?

这是我的代码:

zoo.h


namespace extzoo
{
namespace intzoo
{
class zoo
{
public:
enum class Size
{
small, medium, large
};
const std::string hello_zoo();
const std::string getname_zoo();
const Size get_size();
void set_size(Size);
private:
Size size;
};
}
}

zoo.cpp


using namespace extzoo::intzoo;
using namespace extzoo;
const std::string zoo::hello_zoo() {
return std::string("hello, zoo");
}
const std::string zoo::getname_zoo() {
std::string input;
std::cout<<"Please enter your favorit zoo name: ";
std::getline(std::cin,input);
return std::string("Your favorit zoo name is: ").append(input);
}
const zoo::Size zoo::get_size()
{
return this->size;
}
void zoo::set_size(zoo::Size s)
{
this->size = s;
}

我的代码将C ++方法公开给python

pyintf.cpp


class DummyZoo{
};
BOOST_PYTHON_MODULE(pyintf) {
extzoo::intzoo::
python::enum_<zoo::Size>("Size")
.value("small", zoo::small)
.value("medium", zoo::medium)
.value("large", zoo::large)
;
scope intzoo
= class_<DummyZoo>("intzoo");
class_<intzoo::zoo>("zoo")
.def("hello_zoo", &extzoo::intzoo::zoo::hello_zoo)
.def("getname_zoo", &extzoo::intzoo::zoo::getname_zoo)
.def("get_size",&extzoo::intzoo::zoo::get_size)
.def("set_size",&extzoo::intzoo::zoo::set_size)
;
}

我遇到以下错误:

[root@localhost enumclass]# g++ -shared -std=c++11 -o pyintf.so -fPIC pyintf.cpp zoo.h zoo.cpp -lboost_python -lpython2.7 -I/usr/include/python2.7
pyintf.cpp: In function ‘void init_module_pyintf()’:
pyintf.cpp:34:2: error: ‘extzoo::intzoo::python’ has not been declared
python::enum_<zoo::Size>("Size")
pyintf.cpp:34:25: error: expected primary-expression before ‘>’ token
python::enum_<zoo::Size>("Size")
pyintf.cpp:35:8: error: request for member ‘value’ in ‘("Size")’, which is of non-class type ‘const char [5]’
.value("small", zoo::small)
pyintf.cpp:35:23: error: ‘small’ is not a member of ‘extzoo::intzoo::zoo’
.value("small", zoo::small)
pyintf.cpp:36:24: error: ‘medium’ is not a member of ‘extzoo::intzoo::zoo’
.value("medium", zoo::medium)
pyintf.cpp:37:19: error: ‘large’ is not a member of ‘extzoo::intzoo::zoo’
.value("large", zoo::large)

1 个答案:

答案 0 :(得分:0)

与您之前的SO question一样,问题在于类方法的定义未在名称空间中定义。使用using namespace ...是为了带来该名称空间内容的可见性,而不是为了定义该名称空间的内容。