'function' в пространстве имен 'std' не называет тип шаблона - PullRequest
0 голосов
/ 22 мая 2018

Используя пакет Rcpp для включения C ++ в R, я попытался скомпилировать мой файл C ++.Вот ошибка, которая пришла:

'функция' в пространстве имен 'std' не называет тип шаблона

После исследования мне сказали, что мой код использовалсянекоторые функции доступны только в C ++ 11. Поэтому мне нужно добавить одну строку в мой файл Makevars.Однако я нашел виньетку с надписью «Makevars» больше не обязательна: Rcpp vignette .Как я могу решить эту проблему?

Вот часть скрипта C ++, которая не работает:

std::function<void(const state_type, state_type, const double)> eqsir2(const Rcpp::NumericVector theta) {
  return [&theta](const state_type &x, state_type &dxdt, const double t) {
    boost_array_to_nvec2(x, nvec);
    my_fun22(nvec,t,theta);
    nvec_to_boost_array2(nvec, dxdt);
  }

1 Ответ

0 голосов
/ 22 мая 2018

Чтобы иметь возможность использовать std::function в C ++, вы должны включить правильный заголовок через

#include <functional>

где-нибудь в вашей базе кода.

Что касается стороны R, у вас естьсообщить компилятору, что вы хотите использовать функции C ++ 11.Если у вас есть только файл .cpp, который вы добавляете через Rcpp::sourceCpp, вам нужно добавить

// [[Rcpp::plugins(cpp11)]]

в ваш файл .cpp.

Если вы пишете пакет R(для этого предназначена виньетка, которую вы цитируете), тогда файл src/Makevars больше не является обязательным для использования Rcpp, но использование CXX_STD в src/Makevars - это рекомендуемый способ запроса C ++ 11 при написаниипакет.В качестве альтернативы вы можете использовать SystemRequirements в DESCRIPTION.Ссылаясь на Запись расширений R :

Чтобы использовать код C ++ 11 в пакете, файл Makevars пакета (или Makevars.win в Windows) должен содержать строку

CXX_STD = CXX11

Компиляция и компоновка будут выполняться с помощью компилятора C ++ 11.

Пакеты без файла src / Makevars или src / Makefile могут указывать, чтоони требуют C ++ 11 для кода в каталоге src, включая «C ++ 11» в поле «SystemRequirements» файла DESCRIPTION, например,

SystemRequirements: C ++ 11

Если в пакете есть файл src / Makevars [.win], то установка переменной make 'CXX_STD' предпочтительна, поскольку позволяет R CMD SHLIB корректно работать в каталоге src пакета.

InКроме того, вы должны убедиться, что сигнатура возвращаемой функции и лямбда идентичны (см., например, здесь ).В настоящее время вы используете ссылки только для одного из них.И то, и другое возможно, просто нужно быть последовательным:

#include <Rcpp.h>
// [[Rcpp::plugins(cpp11)]]
#include <functional>

// [[Rcpp::depends(BH)]]
#include <boost/array.hpp>
typedef boost::array<double, 3> state_type;

// references
std::function<void(const state_type&, state_type&, const double)> eqsir2(const Rcpp::NumericVector theta) {
  return [&theta](const state_type &x, state_type &dxdt, const double t) {return;};
}

// no references
std::function<void(const state_type, state_type, const double)> eqsir(const Rcpp::NumericVector theta) {
  return [&theta](const state_type x, state_type dxdt, const double t) {return;};
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...