Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Boost-Python签名不匹配问题_C++_Python_Boost Python - Fatal编程技术网

C++ Boost-Python签名不匹配问题

C++ Boost-Python签名不匹配问题,c++,python,boost-python,C++,Python,Boost Python,我得到了一个与python公开的方法不匹配的签名。下面是代码 class StatusEffect { public: //Virtual functions and non related ommitted void AddCancellation(std::string &effect) { CancelsEffects.insert(effect); } } StatusEffect中有一些虚拟方法我想在python脚本中重写,所以我创建了一

我得到了一个与python公开的方法不匹配的签名。下面是代码

class StatusEffect
{
public:
   //Virtual functions and non related ommitted
   void AddCancellation(std::string &effect)
   {
       CancelsEffects.insert(effect);
   }
}
StatusEffect中有一些虚拟方法我想在python脚本中重写,所以我创建了一个类包装器。包装器不会以任何方式覆盖或更改AddCancellation,我只是简单地将其显示给mark

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)
    ;
但是,当我这样做时,我会得到以下错误:

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})
毒药
回溯(最近一次呼叫最后一次):
文件“.\..\..\Resources\Scripts\StatusEffects.py”,第27行,在
Regen=StatCreepEffect(“Regen”,Stat.HP,0.05,“再生少量
“HP每转一圈”,PrimaryEngine.GetUID(),14,4,True,True,StatusCategories.S
C_Regen,0,StatusFlags.ticeffect,True,StatusPersistence.SP_Timer_Cure,[“Poi
儿子“,”毒药-“])
文件“.\..\Resources\Scripts\StatusEffects.py”,第11行,在初始化中__
自助推送取消(取消)
文件“.\..\..\Resources\Scripts\StatusEffects.py”,第23行,PushCancellati格式
ons
自动添加取消(取消)
ArgumentError:中的Python参数类型
StatusEffect.AddCancellation(StatCreepEffect,str)
与C++签名不匹配:
AddCancellation(类游戏::状态效果::状态效果{lvalue},类标准:
:basic_字符串{l
值})

我不完全确定问题出在哪里。StatCreepEffect应该是StatusEffect的一个实例,不是吗?python会自动处理字符串的转换,不是吗?我调用的方法有误吗?我觉得这是我错过的一件小事,但我不确定它是什么。任何帮助都将不胜感激。

我认为问题可能在于Boost。Python并不完全理解StatusEffectWrapper是从StatusEffect派生的。除非您指定保留类型是出于某种原因,否则我会尝试将类指定为:

class_<StatusEffects::StatusEffectWrapper, boost::noncopyable>("StatusEffect")
    .def("AddCancellation", &StatusEffectWrapper::AddCancellation)
    ;
类(“状态效应”)
.def(“AddCancellation”,&StatusEffectWrapper::AddCancellation)
;

我认为问题可能在于Boost。Python并不完全理解StatusEffectWrapper是从StatusEffect派生的。除非您指定保留类型是出于某种原因,否则我会尝试将类指定为:

class_<StatusEffects::StatusEffectWrapper, boost::noncopyable>("StatusEffect")
    .def("AddCancellation", &StatusEffectWrapper::AddCancellation)
    ;
类(“状态效应”)
.def(“AddCancellation”,&StatusEffectWrapper::AddCancellation)
;

结果我需要

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


结果我需要

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