2012-09-08 124 views
1

我在包裝我的C++中的PHP代碼與SWIG一個問題沒有匹配的功能: 與被聲明爲以下方法我有在C類++:痛飲重載

int hexDump(string &dmpstr,bool space=true)const; 

還我包括std_string。我在我的接口文件中,我可以很好地傳遞字符串參數。 但是當我把我的方法如下我的PHP代碼:

$bf->hexDump('12',true); 

我得到這個錯誤:

Fatal error: No matching function for overloaded 'PKI_Buf_hexDump' 

PKI_Buf是我的類的名稱。 任何想法?

+0

PS:hexDump函數是一個重載函數,它也用4個參數聲明爲:static int hexDump(byte * inbuf,int sz,string&dmpstr,bool space = true); – A23149577

回答

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"; 
    } 
%} 

我也不太知道什麼是正確的precedence value是。我選擇了141,因爲這使得它低於默認字符串值。

<?php 
include('test.php'); 
echo "testing\n"; 
$str = "input"; 
test::func($str, true); 
echo "In PHP: " . $str . "\n"; 
?> 

預期哪個工作:

我所有的作品,覈對無誤的。

我認爲typecheck typemap這個默認情況下不起作用的事實是一個錯誤,因爲它使用的typecheck將無法工作。你可能想在郵件列表中提出這個問題。