2013-06-18 3 views
0

Я довольно новичок в C++ и STL. Здесь есть что-то, что я здесь не понимаю:Объект функции: Недопустимый аргумент

class Foo 
{ 
public: 
    void operator()(int& bar) { std::cout << bar << std::endl; } 
}; 

int main(int ac, char* av[]) 
{ 
    std::vector<int> v; 
    v.push_back(1); 
    v.push_back(2); 
    v.push_back(3); 

    std::for_each(v.begin(), v.end(), Foo); // Invalid argument Foo 

    Foo foo; 
    std::for_each(v.begin(), v.end(), foo); // Valid argument foo 

    return 0; 
} 

Почему первая попытка дает недопустимый аргумент? Большое спасибо!

ответ

5

Поскольку Foo класс (т.е. тип ), в то время как foo является экземпляром (т.е. объекта). for_each() принимает объект для работы.

Имейте в виду, что в C++ типы не являются first-class; они не могут быть переданы в функции и т. д. (однако они могут использоваться как параметры шаблона функции).

+0

Понял, спасибо. –

2

Потому что std::for_each нужен объект вместо класса. Foo - это всего лишь тип.

Ваш код equivalant к этому:

int foo; 
std::for_each(v.begin(), v.end(), int); // the third parameter is incorrect, it must be "foo" 
1

Короткий ответ:

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);

Вы не можете использовать тип, где ожидается значение, или значение, где ожидается тип.

Смежные вопросы