Вы можете работать с PYTHONPATH в корне проекта
PYTHONPATH=. py.test
Или использовать pip install как редактируемый импорт
pip install -e . # install package using setup.py in editable mode
Проблема в том, что для передачи второго аргумента в std::async
компилятор должен превратить выражение &std::accumulate
в указатель функции, но он не знает, какую специализацию шаблона функции вы хотите. Для человека очевидно, что вы хотите тот, который может быть вызван с остальными аргументами в async
, но компилятор этого не знает и должен оценивать каждый аргумент отдельно.
Как PiotrS. ответ говорит, вы можете сказать компилятору, который std::accumulate
вы хотите, с явным списком аргументов шаблона или с помощью приведения, или, альтернативно, вы можете просто использовать выражение лямбда вместо:
std::async(std::launch::async,[&] { return std::accumulate(v.begin(), v.end(), 0.0); });
Внутри тела lambda компилятор выполняет разрешение перегрузки для вызова std::accumulate
, и поэтому он работает, какой std::accumulate
использовать.
Вы должны устранить неоднозначность между возможными экземплярами, либо явно передавая аргументы шаблона, либо используя static_cast
, поэтому:
auto r0 = std::async(std::launch::async
, &std::accumulate<decltype(v.begin()), double>
, v.begin()
, v.end()
, 0.0);
или:
auto r0 = std::async(std::launch::async
, static_cast<double(*)(decltype(v.begin()), decltype(v.end()), double)>(&std::accumulate)
, v.begin()
, v.end()
, 0.0);