我有一段C++代码,我正在尝试使用看起来像这样的boost python包装:

头文件:

template<class CatalogClass, class MemberClass>
class MyIterator
{
    public:
        MyIterator(SomeOtherArg& arg);

    private:
        Blah<CatalogClass,MemberClass>* mIterator;

cpp文件:
template<class CatalogClass, class MemberClass>
MyIterator<CatalogClass, MemberClass>::MyIterator(SomeOtherArg& arg)
{
    mIterator = new Blah<CatalogClass,MemberClass>(arg);
}

提高cpp:
class_<MyIterator<CatalogClass,MemberClass>>("MyIterator", init<SomeOtherArg&>())
;

我进行参数化的原因是MyIterator可以用于各种类,因此,我不需要为从CatalogClass / MemberClass派生的每个类重写此迭代器。但是,在编译/链接时出现错误消息:
Undefined symbols for architecture x86_64: MyIterator<CatalogClass,MemberClass>::MyIterator(SomeOtherArg&): referenced from boost::python::objects::value_holder<MyIterator<CatalogClass, MemberClass> >::value_holder<boost::python::objects::reference_to_value<SomeOtherArg&> >(_object*, boost::python::objects::reference_to_value<SomeOtherArg&>) in Test.o

还期望我在哪里定义这个?谢谢!

最佳答案

您必须记住,在对模板进行专门化之前,模板化类实际上并不存在,这意味着,除非您预先专门指定了迭代器,否则不会导出任何符号,因此没有链接到的符号。您必须为计划使用的每种类型的组合预先特化迭代器,然后将每种特化分别提供给Python。

另一个解决方案是type erasure。您需要修改迭代器以具有非模板基类。类中需要模板的部分将从非模板库继承。然后,您将能够包装基类,但是在Python中将无法访问模板化的东西。

通常,我会尽量避免在我为外部使用而创建的任何库的公共(public)接口(interface)中使用模板。您可以在实现中使用所需的模板,但是您的公共(public)接口(interface)必须生成实际的链接器符号。

关于c++ - 提升python和模板,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28333027/

10-17 01:33