Показать все 10 сообщений этой темы на одной странице |
HLFX.Ru Forum (https://hlfx.ru/forum/index.php)
- Технические вопросы (https://hlfx.ru/forum/forumdisplay.php?forumid=20)
-- Шаблоны, шаблончики (https://hlfx.ru/forum/showthread.php?threadid=4951)
Шаблоны, шаблончики
Есть, например, такой шаблон (метода):
code:
template <typename T> void drawfield(dimension<T>& src, auto func = [](T val){return val;});
code:
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’
code:
template <typename T, typename F> void drawfield(dimension<T>& src, function<T(F)> func = [](T val){return val;});
code:
template <typename T, typename F> void drawfield(dimension<T>& src, F func = [](T val){return val;});
__________________
http://www.moddb.com/mods/monorail-quest
__________________
thambs, это относится к так называемым non-deduced context. http://en.cppreference.com/w/cpp/la...educed_contexts
Вместо дефолтных параметров можно воспользоваться оверлоадингом.
1 | template <typename T, typename F> |
2 | void drawfield(dimension<T>& src, F func) |
3 | { |
4 | ... |
5 | } |
6 |
7 | template <typename T> |
8 | void drawfield(dimension<T>& src) |
9 | { |
10 | drawfield(src, [](T val) {return val;}); |
11 | } |
__________________
I'm on github
I'm on opendesktop.org
XaeroX
ЛОР.
FreeSlave
Мне вот такой вариант подсказали, его и использовал.
template <typename T, typename F = std::function<PLFLT(T)>> |
void drawfield(dimension<T>& src, F func = [](T v){return static_cast<PLFLT>(v);}) |
__________________
http://www.moddb.com/mods/monorail-quest
thambs вот на Лоре и задавай вопросы. Там, по слухам, профессионалы орудуют. Дублировать тут не нужно.
Добавлено 13-02-2017 в 23:41:
Зачем тут второй шаблонный параметр F? Без него всё отлично будет работать через std function. Там точно профессионалы орудуют?
__________________
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
XaeroX
>Зачем тут второй шаблонный параметр F? Без него всё отлично будет работать через std function
Не срабатывает. Точнее, если сделать без второго параметра, то он не принимает лямбду.
__________________
http://www.moddb.com/mods/monorail-quest
thambs у меня принимает, я специально проверял. Gcc последней версии?
__________________
XaeroX
g++-4.9. Хмм. А скинь как ты делал?
У меня шаблон метода:
1 | class plots_t{ |
2 | public: |
3 | /* some stuff */ |
4 | template <typename T, typename F = function<PLFLT(T)>> |
5 | void drawfield(dimension<T>& src, F func = [](T v){return static_cast<PLFLT>(v);}){ |
6 | /* method stuff */ |
7 | }; |
8 | }; |
auto PLLOG10 = [](float val){return (val > 0) ? PLFLT(log10(val)) : (PLFLT)(NAN);}; |
auto PLNONZERO = [](float val){return (val > 0) ? PLFLT(val) : (PLFLT)(NAN);}; |
plots.drawfield(op.cmps[0].ns, PLLOG10); |
__________________
http://www.moddb.com/mods/monorail-quest
thambs сейчас, как ты понимаешь,я скинуть ничего не могу. Попозже. Но вообще я просто взял твой не компилировавшийся шаблон из 1 поста и добавил обвёртку из std function.
__________________
Временная зона GMT. Текущее время 15:04. | Показать все 10 сообщений этой темы на одной странице |
На основе vBulletin версии 2.3.0
Авторское право © Jelsoft Enterprises Limited 2000 - 2002.
Дизайн и программирование: Crystice Softworks © 2005 - 2024