swig对于重载没有匹配功能


swig no matching function for overloaded

我在用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";
?>

正如预期的那样。

我认为,默认情况下,用于此的类型检查类型映射不起作用是一个错误,因为它使用的类型检查永远不会起作用。你可能想在邮件列表中提出这个问题。