Boost Python signature mismatch problem
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)
;
精彩评论