Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
对局部变量的未定义引用 我有C++工厂类,应该在Python脚本中使用: class CCommandFactory { private: typedef std::map<std::string, IAbstractCommandCreator*>::iterator factory_iter; static std::map<std::string, IAbstractCommandCreator*> m_factory; public: template<class T> static void add(const std::string& id) { factory_iter it = m_factory.find(id); if (it == m_factory.end()) { m_factory[id] = new CCommandCreator<T>(); } } static ICommand* create(const std::string& id, boost::python::list args) { factory_iter it = m_factory.find(id); if (it != m_factory.end()) { std::list<std::string> arguments; for (int i = 0; i < len(args); ++i) { arguments.push_back(boost::python::extract<std::string>(args[i])); } return it->second->create(arguments); } return 0; } ~CCommandFactory() { for (factory_iter it = m_factory.begin(); it != m_factory.end(); ++it) { if (it->second) { delete it->second; } } } }; 类CCommandFactory{ 私人: typedef std::map::迭代器工厂; 静态标准::map m_工厂; 公众: 模板 静态void add(const std::string&id){ factory\u iter it=m\u factory.find(id); if(it==m_factory.end()){ m_工厂[id]=新的CCommandCreator(); } } 静态ICommand*create(const std::string&id,boost::python::list args){ factory\u iter it=m\u factory.find(id); if(it!=m_factory.end()){ std::列表参数; 对于(int i=0;i第二个->创建(参数); } 返回0; } ~cCommand工厂(){ for(factory_iter it=m_factory.begin();it!=m_factory.end();+it){ 如果(它->秒){ 删除->秒; } } } };_Python_C++_Boost - Fatal编程技术网

对局部变量的未定义引用 我有C++工厂类,应该在Python脚本中使用: class CCommandFactory { private: typedef std::map<std::string, IAbstractCommandCreator*>::iterator factory_iter; static std::map<std::string, IAbstractCommandCreator*> m_factory; public: template<class T> static void add(const std::string& id) { factory_iter it = m_factory.find(id); if (it == m_factory.end()) { m_factory[id] = new CCommandCreator<T>(); } } static ICommand* create(const std::string& id, boost::python::list args) { factory_iter it = m_factory.find(id); if (it != m_factory.end()) { std::list<std::string> arguments; for (int i = 0; i < len(args); ++i) { arguments.push_back(boost::python::extract<std::string>(args[i])); } return it->second->create(arguments); } return 0; } ~CCommandFactory() { for (factory_iter it = m_factory.begin(); it != m_factory.end(); ++it) { if (it->second) { delete it->second; } } } }; 类CCommandFactory{ 私人: typedef std::map::迭代器工厂; 静态标准::map m_工厂; 公众: 模板 静态void add(const std::string&id){ factory\u iter it=m\u factory.find(id); if(it==m_factory.end()){ m_工厂[id]=新的CCommandCreator(); } } 静态ICommand*create(const std::string&id,boost::python::list args){ factory\u iter it=m\u factory.find(id); if(it!=m_factory.end()){ std::列表参数; 对于(int i=0;i第二个->创建(参数); } 返回0; } ~cCommand工厂(){ for(factory_iter it=m_factory.begin();it!=m_factory.end();+it){ 如果(它->秒){ 删除->秒; } } } };

对局部变量的未定义引用 我有C++工厂类,应该在Python脚本中使用: class CCommandFactory { private: typedef std::map<std::string, IAbstractCommandCreator*>::iterator factory_iter; static std::map<std::string, IAbstractCommandCreator*> m_factory; public: template<class T> static void add(const std::string& id) { factory_iter it = m_factory.find(id); if (it == m_factory.end()) { m_factory[id] = new CCommandCreator<T>(); } } static ICommand* create(const std::string& id, boost::python::list args) { factory_iter it = m_factory.find(id); if (it != m_factory.end()) { std::list<std::string> arguments; for (int i = 0; i < len(args); ++i) { arguments.push_back(boost::python::extract<std::string>(args[i])); } return it->second->create(arguments); } return 0; } ~CCommandFactory() { for (factory_iter it = m_factory.begin(); it != m_factory.end(); ++it) { if (it->second) { delete it->second; } } } }; 类CCommandFactory{ 私人: typedef std::map::迭代器工厂; 静态标准::map m_工厂; 公众: 模板 静态void add(const std::string&id){ factory\u iter it=m\u factory.find(id); if(it==m_factory.end()){ m_工厂[id]=新的CCommandCreator(); } } 静态ICommand*create(const std::string&id,boost::python::list args){ factory\u iter it=m\u factory.find(id); if(it!=m_factory.end()){ std::列表参数; 对于(int i=0;i第二个->创建(参数); } 返回0; } ~cCommand工厂(){ for(factory_iter it=m_factory.begin();it!=m_factory.end();+it){ 如果(它->秒){ 删除->秒; } } } };,python,c++,boost,Python,C++,Boost,这是包装纸: BOOST_PYTHON_MODULE(libfrtpsrv) { class_<CCommandFactory, boost::noncopyable>("CCommandFactory", no_init) .def("create_command", &CCommandFactory::create, args("cmd_id", "args"), return_value_policy<manage_new_object&g

这是包装纸:

BOOST_PYTHON_MODULE(libfrtpsrv)
{
    class_<CCommandFactory, boost::noncopyable>("CCommandFactory", no_init)
        .def("create_command", &CCommandFactory::create, args("cmd_id", "args"), return_value_policy<manage_new_object>())
        .staticmethod("create_command")
    ;
}
BOOST_PYTHON_模块(libfrtpsrv)
{
类(“CCommandFactory”,无初始)
.def(“create_command”,&CCommandFactory::create,args(“cmd_id”,“args”),返回值策略()
.staticmethod(“创建_命令”)
;
}
代码在我看来是正确的,但是python脚本的执行在一开始就失败了:

Traceback (most recent call last):
  File example.py, line 1, in <module>
    import wrapper
  File .../wrapper.py, line 4, in <module>
    from libfrtpsrv import *
ImportError: .../daemon/libfrtpsrv.so: undefined symbol: _ZN15CCommandFactory9m_factoryE  
回溯(最近一次呼叫最后一次):
文件example.py,第1行,在
导入包装器
文件…/wrapper.py,第4行,在
从libfrtpsrv导入*
导入错误:…/daemon/libfrtpsrv.so:未定义的符号:_zn15cCommand和Factory9m_factoryE

我不知道如何解决此问题。

您可以使用此命令查看哪个符号失败:

$ c++filt <<< _ZN15CCommandFactory9m_factoryE
CCommandFactory::m_factory
std::map<std::string, IAbstractCommandCreator*> CCommandFactory::m_factory;