我有一段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/