У меня есть проблема с переносом кода на C ++ в PHP с помощью SWIG: у меня есть класс в 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 – это имя моего класса. Есть идеи??
Проблема здесь, похоже, в том, что тип typecheck для ссылок, не связанных со строкой, отсутствует, и поэтому во время разрешения перегрузки SWIG отвергает то, что действительно является подходящим кандидатом для вызова.
Вы можете обойти это, добавив свою собственную typecheck, я сделал пример:
%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"; ?>
в<?php include('test.php'); echo "testing\n"; $str = "input"; test::func($str, true); echo "In PHP: " . $str . "\n"; ?>
Что работало, как ожидалось.
Я думаю, что тот факт, что typecheck typemap для этого не работает по умолчанию, является ошибкой, так как тип typecheck, который он использует, никогда не будет работать. Возможно, вы захотите поднять это в списках рассылки.