Я просто пытаюсь получить итератор по вектору строк, получая итератор, переданный в «pos» и переданный вместе со значением в pos в другую функцию, но компилятор сообщает мне, что в лямбда-аргументе было недопустимое преобразование из 'const char*' в 'size_t'. Я также получаю это для заголовка stl_algo.h:
не соответствует вызову '(prototype::Monitor::setOptions(size_t)::<lambda(int)>) (const char&)' __f(__first);
#include <iostream>
#include <Windows.h>
#include <string.h>
#include <map>
#include <vector>
#include <algorithm>
#include <iterator>
#include <cstdio>
.
.
void setOptions(size_t id) {
switch(id){
case 0:
std::for_each(main_menu.lines.begin(), main_menu.lines.end(),[this](size_t pos){
this->setOption(pos, main_menu.lines[pos]);
});
break;
case 1:
break;
}
}
Поскольку все это находится внутри класса, на который ссылается this, setOption отличается от setOptions. Я читал в других местах, что было бы хорошо, если бы он просто преобразовывал итератор для указателя строки в int, я также видел примеры, которые использовались подобным образом.
Я также знаю, что все это, вероятно, не лучший способ сделать это, но я только что перешел на С++ и пытаюсь использовать некоторые вещи, которые я узнал.
64-разрядная версия Win10 — gcc (MinGW.org GCC-6.3.0-1)
При повторении вектора строк с помощью std::for_each()
параметр, передаваемый лямбде, будет строкой, а не индексом size_t
. Вот почему вы получаете ошибку преобразования.
Если вам нужен индекс, вам придется изменить свою лямбду, чтобы отслеживать индекс отдельно, например:
size_t pos = 0;
std::for_each(main_menu.lines.begin(), main_menu.lines.end(),
[&,this](const string &s){ this->setOption(pos++, s); }
);
В противном случае просто не используйте std::for_each()
для начала, например:
for(size_t pos = 0; pos < main_menu.lines.size(); ++pos){
setOption(pos, main_menu.lines[pos]);
}
Вы также можете включить pos
в лямбду: [this, pos = 0](const string&) mutable { ... }
.
@DietmarKühl правда, хотя тип pos
в этом случае будет int
, а не size_t
. Вместо этого вам придется использовать [this, pos = size_t{0}]
.
Так что вы бы использовали pos = std::size_t()
или pos = std::string::size_type()
, если это имеет значение для вашего варианта использования. Более интересным было бы написать это с диапазонами, которые должны быть чем-то вроде std::ranges::for_each(zip(main_menu.list, std::ranges::iota(std::size_t()), [this](const std::string& s, std::size_t pos){ ... });
Предупреждение: zip()
[пока] нет.
А что конкретно вы спрашиваете? Взгляните на ссылку для std::for_each, это не так. Там тоже есть примеры. В основном лямбда принимает в качестве параметра элементы повторяющегося диапазона, а не индексы, а не итераторы.