Я хочу использовать синтаксис for_each
с std::vector<std::string>
но я продолжаю получать следующую ошибку:
Error 1 error C3867: 'IO::checkFilePath':
function call missing argument list; use '&IO::checkFilePath' to create a pointer to member
Вот мой код:
void checkFilePath(const std::string& filepath);
void checkFileList(const std::vector<std::string>& filelist);
void IO::checkFilePath(const std::string& filepath)
{
if (!boost::filesystem::exists(filepath) || !boost::filesystem::is_directory(filepath))
{
//do smth
}
}
void IO::checkFileList(const std::vector<std::string>& filelist)
{
std::for_each(filelist.begin(), filelist.end(), checkFilePath);
}
Предполагая, что вы checkFilePath
чтобы checkFilePath
был членом, замените его использование в алгоритме for_each
с помощью:
[&](std::string const& s){return checkFilePath(s);}
и он зафиксирует this
и вызовет метод. Для этого требуется С++ 11, которого у вас может не быть. Если у вас есть С++ 03, вам нужно либо использовать std::bind
либо boost::bind
или написать собственный функтор, чтобы захватить this
или состояние, необходимое для решения проблемы checkFilePath
.
Если ваш checkFilePath
не зависит от состояния this
, просто сделайте метод static
и ваш существующий код должен компилироваться. (В качестве альтернативы, сделайте его свободной функцией).
Функция checkFilePath - это нестатическая функция-член. Его можно вызывать с использованием объекта типа IO. Поэтому вы не можете просто указать его как третий параметр алгоритма for_each. Было бы проще, если бы эта функция была бы статической функцией-членом.
checkFilePath
является функцией-членом, и вы не можете использовать ее напрямую с for_each, сделайте эту функцию глобальной функцией, и все должно работать.