LINUX.ORG.RU

Почему не получается вывести параметр auto?

 ,


0

2

Есть, например, такой шаблон (метода):

template <typename T>
void drawfield(dimension<T>& src, auto func = [](T val){return val;});
Но при попытке вызвать этот метод только с первым аргументом, то копилятор возвращает:
main.cpp:98:26: error: no matching function for call to ‘plots_t::drawfield(dimension<float>&)’
    plots.drawfield(cmp.ns);
                          ^
main.cpp:98:26: note: candidate is:
In file included from main.cpp:31:0:
plots.hpp:25:7: note: template<class T, class auto:1> void plots_t::drawfield(dimension<T>&, auto:1)
  void drawfield(dimension<T>& src, auto func = [](T val){return val;});
       ^
plots.hpp:25:7: note:   template argument deduction/substitution failed:
main.cpp:98:26: note:   couldn't deduce template parameter ‘auto:1’
Шаблоны вида
template <typename T, typename F>
void drawfield(dimension<T>& src, function<T(F)> func = [](T val){return val;});
или
template <typename T, typename F>
void drawfield(dimension<T>& src, F func = [](T val){return val;});
тоже не прокатывают. Как сделать правильно и ЧЯНДТ?

★★★★★

Последнее исправление: thunar (всего исправлений: 1)

Почему не получается вывести параметр auto?
c++11

auto в параметрах доступен же только с c++14, не?

xaizek ★★★★★
()
Ответ на: комментарий от eao197

Да, это оно. Не знаете способа, как извратиться без дополнительной структуры? Через левую структуру да, можно. А вот без неё? Даже с включенным C++1z что-то никак не получается.

Судя по тому, что говорит стандарт - нельзя.

zamazan4ik ★★
()
Последнее исправление: zamazan4ik (всего исправлений: 1)
Ответ на: комментарий от zamazan4ik

Не знаете способа, как извратиться без дополнительной структуры?

Не, до такого уровня C++-фу у меня не дотягивает :)

eao197 ★★★★★
()
Ответ на: комментарий от thunar

Такое и в C++11, вроде, работает:

template <typename T>
void drawfield(dimension<T>& src, function<T(T)> func = [](T val){return val;});
typename F там ни к чему.

xaizek ★★★★★
()
Ответ на: комментарий от eao197

Спасибо. Не знал про валидность подобного приведения.

zamazan4ik ★★
()
Ответ на: комментарий от zamazan4ik

Ну, std::function — это не украшение. Это лишний shared_pointer по сути своей.

eao197 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.