我在用SWIG包装PHP中的c++代码时遇到问题:我在C++中有一个带有方法的类,声明如下:
int hexDump(string &dmpstr,bool space=true)const;
我还在接口文件中包含std_string.I,我可以很好地传递字符串参数。但是当我在PHP代码中调用我的方法时,如下所示:
$bf->hexDump('12',true);
我得到了这个错误:
Fatal error: No matching function for overloaded 'PKI_Buf_hexDump'
PKI_Buf是我班的名字。知道吗??
这里的问题似乎是缺少对非常量字符串引用的类型检查,因此在重载解决过程中,SWIG拒绝了真正合适的调用对象。
你可以通过添加自己的字体检查来解决这个问题,我举了一个例子:
%module test
%include <std_string.i>
%typemap(typecheck,precedence=141) std::string& str {
$1 = Z_TYPE_PP($input) == IS_STRING;
}
%{
#include <iostream>
%}
%inline %{
void func(std::string& str, bool b=false) {
std::cout << "In C++: " << str << "'n";
str = "output";
}
%}
我不太确定什么是正确的优先级值。我选择了141,因为这会使它低于默认的字符串值。
我检查了它的所有工作正常:
<?php
include('test.php');
echo "testing'n";
$str = "input";
test::func($str, true);
echo "In PHP: " . $str . "'n";
?>
正如预期的那样。
我认为,默认情况下,用于此的类型检查类型映射不起作用是一个错误,因为它使用的类型检查永远不会起作用。你可能想在邮件列表中提出这个问题。