Элементарно, Ватсон. Вы сначала объявляете TraverseFuncPtr как указатель на функцию:
typedef void (*TraveseFuncPtr) (int&);
---
и A::TraverseVector как принимающий этот указатель параметром:
> class A
> {
> public:
> std::vector < int > m_vData;
> void TraverseVector(TraveseFuncPtr in_func)
> {
> for (int i = 0; i < m_vData.size(); i++)
> {
> (*in_func)(m_vData[i]);
> }
> }
> };
---
но после этого вы пытаетесь подсунуть вместо указателя на функцию что-то совершенно другое - объект, не имеющий неявного приведения к TraverseFuncPtr:
tmp_a.TraverseVector(AddNumber(13)); //C2664
---
Естественно, компилятор обижается.
> Пытался пробиться через дебри STL, но там тот же for_each > принимает > КЛАСС (!) - параметр шаблона которым > собственно и является. (Хотя при использовании for_each я > явно ему параметр не передаю т.е. испльзую как обычную > фунцкию). Не дайте себя запутать. Параметром шаблона может быть ЛЮБОЙ ТИП, хоть int. Правда, внутри for_each стоит вызов этого самого шаблонного "объекта" со скобками, в результате возможные варианты ограничиваются указателем на функцию либо объектом имеющим operator() (больше ничего такой синтаксис не переварит).
Итого. Если вы хотите передавать и указатели на функции, и функторы, у вас два варианта:
1) TraverseVector принимает на входе объект unary_function или binary_function (внимание - не по значению! иначе произойдет срезка типа). Функторы наследуются от unary_functin/binary_function. Указатели на функции при передаче обертываются в unary_function/binary_function (см. ptr_fun у Страуструпа)
2) TraverseVector объявляется шаблоном и на принимает параметр с шаблонным типом. Тогда он ничем по способу работы с параметрами не будет отличаться от for_each.
Есть еще и третий вариант:
3) Не использовать TraverseVector, а выкрутиться через for_each и чуть более сложный функтор, который будет, например, другом класса A. Идеологически это более правильно, особенно если есть возможность обойтись без дружественных отношений классов.
|