2011-06-06 200 views
0

我遇到了使用python公開的方法簽名不匹配問題。這裏的下面提升Python簽名不匹配問題

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

有在StatusEffect一些虛擬方法,我想在我的Python腳本重寫代碼,所以我創建了一個類包裝。該包裝不覆蓋或更改AddCancellation以任何方式,我簡單的展示它來標記

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

我將其暴露在蟒蛇如下:

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, 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-"]) 

然而,當我這樣做,我得到以下錯誤:

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}) 

我不完全確定問題是什麼。 StatCreepEffect應該是StatusEffect的一個實例嗎?而Boost :: python自動處理字符串的轉換不是嗎?我是否錯誤地調用了該方法?感覺這是我錯過的小事,但我不確定它是什麼。任何幫助,將不勝感激。

回答

2

原來我需要有

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

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

我認爲問題可能是Boost.Python不完全理解StatusEffectWrapper是從StatusEffect派生的。除非有某種原因,你指定手持式,我會盡量只指定類爲:

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