Короткий ответ:
foo
является переменной типа Foo
, но Foo
тип. Он не может использоваться как аргумент функции C++, только как аргумент шаблона.
Длинный ответ:
функция C++ принимает значения в качестве аргумента, а не типов.
std::for_each
не является функцией C++, это шаблон функции.
Шаблон Математическая функция, использующая типы C++ (или иногда константы) в качестве аргументов. Шаблон класса - это функция от типов (или констант) до классов. Шаблон функции - это функция от типов (или констант) до функции C++.
При применении к соответствующим типам C++ (один тип итератора, один тип функтора), std::for_each
отображает функцию C++.
Здесь аргументы шаблона std::for_each
выведены из списка аргументов:
std::for_each(v.begin(), v.end(), foo);
, потому что типы v.begin()
, v.end()
, foo
являются соответственно. std::vector<int>::iterator
, std::vector<int>::iterator
, Foo
, компилятор может вывести аргументы шаблона std::for_each
.
Вы можете поставить аргумент шаблона явно даже там, где они могут быть выведены:
std::for_each<std::vector<int>::iterator, Foo> (v.begin(), v.end(), foo);
Вы не можете использовать тип, где ожидается значение, или значение, где ожидается тип.
Понял, спасибо. –