微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Boost Python签名不匹配问题

如何解决Boost Python签名不匹配问题

| 我遇到的特征与我暴露给python的方法不匹配。这是下面的代码
class StatusEffect
{
public:
   //Virtual functions and non related ommitted
   void AddCancellation(std::string &effect)
   {
       CancelsEffects.insert(effect);
   }
}
我想在我的python脚本中覆盖StatusEffect中的一些虚拟方法,因此我创建了一个类包装器。包装器不会以任何方式覆盖或更改AddCancellation,我很简单地将其标记
struct StatusEffectWrapper : Game::StatusEffects::StatusEffect
{
   //Wrappings for virtual functions here. I don\'t touch AddCancellation
}
我将其暴露给python如下:
 class_<StatusEffects::StatusEffect,boost::noncopyable,std::auto_ptr<StatusEffectWrapper> >(\"StatusEffect\")
    .def(\"AddCancellation\",&StatusEffect::AddCancellation)
    ;
在我的python文件中,我扩展了基本的StatusEffect类,如下所示:
class StatCreepEffect(StatusEffect):
    def __init__(self,name,stat_,rate_,descript,uid,turns,prior,canrefresh,poseffect,cats,conds,flgs,sep,pers,cancels):
        StatusEffect.__init__(self,pers)
        self.rate = rate_
        self.stat = stat_
        self.PushCancellations(cancels)
    def PushCancellations(self,cancels):
        for cancel in cancels:
            print (cancel)
            self.AddCancellation(cancel)

Regen = StatCreepEffect(\"Regen\",Stat.HP,0.05,\"Regenerates a small amount of HP every turn\",PrimaryEngine.GetUID(),14,4,True,StatusCategories.SC_Regen,StatusFlags.TickEffect,StatusPersistence.SP_Timer_Cure,[\"Poison\",\"Poison-\"])
但是,这样做时,出现以下错误
Poison
Traceback (most recent call last):
  File \"..\\..\\..\\Resources\\Scripts\\StatusEffects.py\",line 27,in <module>
    Regen = StatCreepEffect(\"Regen\",\"Regenerates a small amount
of HP every turn\",StatusCategories.S
C_Regen,[\"Poi
son\",\"Poison-\"])
  File \"..\\..\\..\\Resources\\Scripts\\StatusEffects.py\",line 11,in __init__
    self.PushCancellations(cancels)
  File \"..\\..\\..\\Resources\\Scripts\\StatusEffects.py\",line 23,in PushCancellati
ons
    self.AddCancellation(cancel)
Boost.Python.ArgumentError: Python argument types in
    StatusEffect.AddCancellation(StatCreepEffect,str)
did not match C++ signature:
    AddCancellation(class Game::StatusEffects::StatusEffect {lvalue},class std:
:basic_string<char,struct std::char_traits<char>,class std::allocator<char> > {l
value})
我不确定是什么问题。 StatCreepEffect应该是StatusEffect的实例,不是吗? Boost :: python会自动处理字符串的转换,不是吗?我调用方法有误吗?感觉好像我错过了一些小东西,但是我不确定它是什么。任何帮助,将不胜感激。     

解决方法

        原来我需要
void AddCancellation(std::string &effect)
{
   CancelsEffects.insert(effect);
}
void AddCancellation(const std::string &effect)
{
   CancelsEffects.insert(effect);
}
    ,        我认为问题可能在于Boost.Python并不完全了解StatusEffectWrapper是从StatusEffect派生的。除非出于某种原因要指定保留类型,否则我将尝试仅将类指定为:
class_<StatusEffects::StatusEffectWrapper,boost::noncopyable>(\"StatusEffect\")
    .def(\"AddCancellation\",&StatusEffectWrapper::AddCancellation)
    ;
    

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。