Не удалось вывести параметр шаблона '_Fn' [duplicate]

Вы можете работать с PYTHONPATH в корне проекта

PYTHONPATH=. py.test

Или использовать pip install как редактируемый импорт

pip install -e .   # install package using setup.py in editable mode
5
задан Some programmer dude 12 September 2014 в 19:52
поделиться

2 ответа

Проблема в том, что для передачи второго аргумента в 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 использовать.

8
ответ дан Jonathan Wakely 24 August 2018 в 23:59
поделиться

Вы должны устранить неоднозначность между возможными экземплярами, либо явно передавая аргументы шаблона, либо используя 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);
5
ответ дан Piotr Skotnicki 24 August 2018 в 23:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: