RCPP - нет подходящей функции для вызова 'transform' - PullRequest
1 голос
/ 22 мая 2019

У меня проблема при использовании Rcpp на Mac (в Windows проблема не возникает).

Вот код C ++, который вызывает ошибку.

#include <Rcpp.h>
using namespace Rcpp;

NumericVector vecpow(const IntegerVector base, const NumericVector exp) 
{
  NumericVector out(base.size());
  std::transform(base.begin(), base.end(), exp.begin(), out.begin(), ::pow);
  return out;
}

Кажется, ничего особенного или сложного.

Тем не менее, я получаю следующую ошибку при попытке скомпилировать ее:

na_ma.cpp: 7: 3: ошибка: нет подходящей функции для вызова 'transform' std :: transform (base.begin (), base.end (), exp.begin (), out.begin (), :: pow); ^ ~~~~~~~~~~~~~

/ Библиотека / Разработчик / CommandLineTools / usr / include / c ++ / v1 / алгоритм: 2028: 1: примечание: шаблон функции-кандидата недопустим: требуется 4 аргумента, но было предоставлено 5 преобразование (_InputIterator __first, _InputIterator __last, _OutputIterator __result, _UnaryOperation __op) ^

Мне интересно, как это исправить. При поиске решений я пришел к некоторым предложениям создать файл Makevars, но у меня это не сработало.

Было бы также неплохо, если бы кто-нибудь мог объяснить мне, почему эта ошибка происходит, поскольку я ее не понимаю.

1 Ответ

4 голосов
/ 22 мая 2019

Это на самом деле ошибка компилятора C ++. Компилятор не может сопоставить :: pow с BinaryOp, поэтому упакуйте его в лямбду. Это работает для меня

std::transform(base.cbegin(), base.cend(), exp.cbegin(), out.begin(), [](double a, double b) {return ::pow(a, b); });

Если лямбды не доступны, можно попытаться сделать функтор (которому соответствует лямбда, проверьте https://medium.com/@winwardo/c-lambdas-arent-magic-part-1-b56df2d92ad2, https://medium.com/@winwardo/c-lambdas-arent-magic-part-2-ce0b48934809). Вдоль строк (непроверенный код, я не на своем компьютер)

struct pow_wrapper {
    public: double operator()(double a, double b) {
        return ::pow(a, b);
    }
};

Тогда попробуйте

std::transform(base.cbegin(), base.cend(), exp.cbegin(), out.begin(), pow_wrapper());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...