Этот вопрос состоит из двух частей. Что я хочу сделать, так это поместить большую часть моей программной логики в классы c ++, а некоторые функции, связанные с представлениями, в js (например, манипуляции с DOM и стилизация). Я использую emscripten embind для классов, и он отлично работает, пока я не знаю, как взаимодействовать с кодом hte js (их учебник действительно ограничен).
Я думал передать объект val классу C ++ в соответствии с их руководством (https://github.com/kripken/emscripten/wiki/Tutorial) Передача работает просто отлично, в то время как функция «call» не работает. Я получил ошибку во время компиляции
Вот пример, который я попробовал, который они поставили в своем уроке
#include <emscripten/val.h>
using namespace emscripten;
int main(){
val Math = val::global("Math");
Math.call("abs",-10);
return 0;
}
и я получил следующие ошибки:
ошибка: нет соответствующей функции-члена для вызова ‘call’
Math.call ( «абс», — 10);
~~~~ ^ ~~~
emscripten / 1.5.6 / system / include / emscripten / val.h: 247: 21: примечание: шаблон кандидата проигнорирован: не удалось вывести аргумент шаблона «ReturnValue»
Вызов ReturnValue (const char * name, Args&&… args) const {
В основном это говорит о том, что компилятор не знает тип возвращаемого значения функции «call».
Я сделал что-то не так или есть лучший способ взаимодействия с кодом JS?
Спасибо,
уг
Это распространенная проблема C ++. Как правило, следующее сообщение всегда должно вызывать двойную проверку в C ++:
note: candidate template ignored: couldn't infer template argument 'ReturnValue' ReturnValue call(const char* name, Args&&... args) const
В основном это означает, что вы пытались вызвать шаблонную функцию, но не указали необходимые типы.
Если вы посмотрите на подпись (в system/include/emscripten/val.h
):
template<typename ReturnValue, typename... Args>
ReturnValue call(const char* name, Args&&... args) const
Хотя это может сделать вывод Args
довольно хорошо, он понятия не имеет, что ReturnValue
возможно. Поэтому вызов этой функции должен быть сделан, например, через:
Math.call<int>("abs",-10);
Других решений пока нет …