Cython - '抽象声明者'编译器警告

时间:2014-03-28 23:40:09

标签: python c++ cython

情况如下:我想包装方法Unit.getDistance

//Unit.h
class Unit{
    ....
    int getDistance(PositionOrUnit target) const;
};
//PositionUnit.h
class PositionOrUnit{
    PositionOrUnit(Unit unit = nullptr);
    PositionOrUnit(Position pos);
};

库使用转换构造函数允许编译器将UnitPosition自动构造为PositionOrUnit对象,以便可以传递UnitPosition直接反对此方法。

#cUnit.pxd
ctypedef UnitInterface *Unit
cdef cppclass UnitInterface:
    int getDistance(PositionOrUnit target) const

#cPositionUnit.pxd
cdef cppclass PositionOrUnit:
    PositionOrUnit() #fake for nullptr unit
    PositionOrUnit(Unit unit)
    PositionOrUnit(Position pos)

现在我不知道如何在Python中创建转换构造函数,因此我使用子类多态来使其工作。我声明了一个基类PositionUnitConverter,并从中获得了UnitPosition个子类。

#PositionUnit.pyx

cdef class PositionUnitConverter:
    cdef cPositionUnit.PositionOrUnit getPositionOrUnit(self):
        return cPositionUnit.PositionOrUnit()

cdef class PositionOrUnit(PositionUnitConverter):
    cdef cPositionUnit.PositionOrUnit thisobj

    cdef cPositionUnit.PositionOrUnit getPositionOrUnit(self):
        return self.thisobj

#Unit.pyx

cdef class Unit(PositionUnitConverter):
    cdef cUnit.Unit thisptr

    cdef cPositionUnit.PositionOrUnit getPositionOrUnit(self):
        return cPositionUnit.PositionOrUnit(self.thisptr)

    def getDistance(self, PositionUnitConverter target):
        return self.thisptr.getDistance(target.getPositionOrUnit())

最终的结果是,在我的Python代码中,我可以用任何一种类型的对象调用Unit.getDistance。

# this works
unit.getDistance(unit2)

但现在我收到了其中几条警告:

CyBW\CyBW.cpp(15698) : warning C4190: 'abstract declarator' has C-linkage specified, but 
returns UDT 'BWAPI::PositionOrUnit' which is incompatible with C  
../include/BWAPI/PositionUnit.h(13) : see declaration of 'BWAPI::PositionOrUnit'

在该行生成的.cpp代码是:(拆分为更容易阅读)

__pyx_vtable_4CyBW_5BWAPI_PositionUnitConverter.getPositionOrUnit = (BWAPI::PositionOrUnit 
(*)(struct __pyx_obj_4CyBW_5BWAPI_PositionUnitConverter *)) 
__pyx_f_4CyBW_5BWAPI_21PositionUnitConverter_getPositionOrUnit;

我的问题是:

  1. 我做错了什么来得到这个警告
  2. 如何避免此警告?
  3. 或者我应该忽略此警告,以及如何?
  4. 如果还有其他任何我可以提供的帮助,请发表评论。

0 个答案:

没有答案