1

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は私のクラスの名前です。何か案が??

4

1 に答える 1

2

ここでの問題は、非定数文字列参照のタイプチェックが欠落しているため、過負荷の解決中に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";
?>

これは期待どおりに機能しました。

このためのタイプチェックタイプマップがデフォルトで機能しないという事実は、それが使用するタイプチェックが機能しないため、バグだと思います。これをメーリングリストで取り上げることをお勧めします。

于 2012-09-14T15:01:48.790 に答える