我必须将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)
答案 0 :(得分:0)
与您之前的SO question一样,问题在于类方法的定义未在名称空间中定义。使用using namespace ...
是为了带来该名称空间内容的可见性,而不是为了定义该名称空间的内容。