【发布时间】:2017-11-07 18:17:36
【问题描述】:
我有一个令人沮丧的问题,我花了很多时间处理它,但我没有找到任何解决方案。
我想在 SWIG 中使用 PHP 中的 C++ 类。我生成了我的共享对象,它适用于某些方法,但是每当我使用字符串参数作为输入调用方法时,我都会遇到此错误:
致命错误:在
PKI_Buf_initHex的参数 2 中键入错误。期待SWIGTYPE_p_std__string
PKI_Buf_initHex 是 SWIG 自动创建的包装器类的名称。在我的 C++ 代码中,我将 initHex 方法声明为:
int initHex(const string x)
{..}
我在我的接口文件中包含了typemaps.i 和std_string.i,但我得到了同样的错误信息。
如果有人能帮助我解决这个问题,我将不胜感激。
【问题讨论】:
-
标题中必须有
using namespace std;或using std::string;。第一个是非常糟糕的形式,对 SWIG 来说非常非常糟糕。后者也是 SWIG 无法处理的。将你的函数声明为int initHex(const std::string x)(旁白:为什么是const?你在这里传递值。) -
首先非常感谢你的帮助,我检查了我的头文件,我有 using namespace std;所以我将其更改为“使用std :: string”并将我的函数更改为“int initHex(const std :: string x),但没有任何改变。我得到了同样的错误:(。知道吗?(旁白:我代码不是我自己实现的,我也没有看到源代码,我只有头文件和目标文件,我必须在PHP中开发代码以供某些用途。)
-
实际上我检查了 SWIG wrap.cpp 文件中的代码,我发现 SWIG 很好地识别了字符串类型:
-
您可能刚刚在 SWIG 接口文件中添加
%include <std_string.i>为时已晚 - 它需要在 SWIG 看到std::string的任何用法之前出现。 -
@Flexo:显然这是我荒谬的错。非常感谢您的帮助,我非常感谢您在调试方面的专业水平;)