开发者

Boost Python signature mismatch problem

开发者 https://www.devze.com 2023-03-11 21:39 出处:网络
I\'m getting a signature mismatch with a method I\'m exposing to python. Here\'s the code below class StatusEffect

I'm getting a signature mismatch with a method I'm exposing to python. Here's the code below

class StatusEffect
{
public:
   //Virtual functions and non related ommitted
   void AddCancellation(std::string &effect)
   {
       CancelsEffects.insert(effect);
   }
}

There are some virtual methods in StatusEffect that I want to override in my python scripts, so I created an class wrapper. The wrapper does not override or change AddCancellation in any way, I'm simple showing it to mark

struct StatusEffectWrapper : Game::StatusEffects::StatusEffect
{
   //Wrappings for virtual functions here. I don't touch AddCancellation
}

I expose it to python as follows:

 class_<StatusEffects::StatusEffect, boost::noncopyable, std::auto_ptr<StatusEffectWrapper> >("StatusEffect")
    .def("AddCancellation", &StatusEffect::AddCancellation)
    ;

In my python file, I extend the basic StatusEffect class like so:

class StatCreepEffect(StatusEffect):
    def __init__(self, name, stat_, rate_, descript, uid, turns, prior, canrefresh, poseffect, cats, conds, flgs, sep, pers, cancels):
        StatusEffect.__init__(self, name, descript, uid, turns, prior, canrefresh, poseffect, cats, conds, flgs, sep, 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, True, StatusCategories.SC_Regen, 0, StatusFlags.TickEffect, True, StatusPersistence.SP_Timer_Cure, ["Poison", "Poison-"])开发者_开发知识库

However, when I do so, I get the following error:

Poison
Traceback (most recent call last):
  File "..\..\..\Resources\Scripts\StatusEffects.py", line 27, in <module>
    Regen = StatCreepEffect("Regen", Stat.HP, 0.05, "Regenerates a small amount
of HP every turn", PrimaryEngine.GetUID(), 14, 4, True, True, StatusCategories.S
C_Regen, 0, StatusFlags.TickEffect, True, StatusPersistence.SP_Timer_Cure, ["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})

I'm not entirely sure what the problem is. StatCreepEffect should be an instance of StatusEffect shouldn't it? And Boost::python automatically handles the conversion of string doesn't it? Am I calling the method incorrectly? It feelslike it's something small that I've missed, but I'm not sure what it is. Any help would be appreciated.


Turns out I need to have

void AddCancellation(std::string &effect)
{
   CancelsEffects.insert(effect);
}

as

void AddCancellation(const std::string &effect)
{
   CancelsEffects.insert(effect);
}


I think the problem might be that Boost.Python doesn't entirely understand that StatusEffectWrapper is derived from StatusEffect. Unless there's some reason that you're specifying the held type, I'd try just specifying the class as:

class_<StatusEffects::StatusEffectWrapper, boost::noncopyable>("StatusEffect")
    .def("AddCancellation", &StatusEffectWrapper::AddCancellation)
    ;
0

精彩评论

暂无评论...
验证码 换一张
取 消