将类型转换为Python

3 投票
1 回答
1865 浏览
提问于 2025-04-16 14:48

我正在使用boost python。我导出了一些函数,这些函数的参数需要一个类CL_DomElement。现在,当我运行应用程序时,我遇到了:

TypeError: No to_python (by-value) converter found for C++ type: CL_DomElement

关于代码的部分。我导出了一个函数,这个函数的参数是一个函数指针。下面是代码:

typedef boost::function<boost::shared_ptr<Object> (CL_DomElement*, std::string& desc)> Parser;
void registerParser(std::string type, Parser p);

struct ParserProxy
{
    bp::object callable;

    ParserProxy(bp::object callable)
    : callable(callable)
    { }

    boost::shared_ptr<Object> operator()(CL_DomElement* elem, std::string& desc)
    {
        bp::object obj = callable(elem, desc);
        return bp::extract<boost::shared_ptr<Object> >(obj);
    }
};

void registerParserByProxy(std::string type, bp::object callable)
{
    registerParser(type, ParserProxy(callable));
}

// In some boost.python module
bp::def("RegisterParser", registerParserByProxy);

我在Python中这样注册它:

class TestObj(Object):
    @staticmethod
    def ParseTestObj(node, desc):
        print 'Parser is called!'
# Register parser
RegisterParser("testobj", TestObj.ParseTestObj)

注册成功了,我检查了我的映射(注册解析器会把传入的键值对添加到std::map中),一切都很好(新值已添加)。现在我想调用传入的指针:

boost::shared_ptr<Object> TypesManager::parseObject(CL_DomElement* objectTag, const std::string &type, std::string &desc)
{
    return (getParser(type))(objectTag, desc);
}

getParser从std::map中返回一个以type为键的函数指针。


所以,我觉得在传递类CL_DomElement时出现了问题。但我在我的模块中做了:

bp::class_<CL_DomElement>("CL_DomElement");

我认为这不应该导致我描述的错误。那么,问题出在哪里呢?

1 个回答

撰写回答