Здравствуйте!
Вот собственно вопрос:
У Страусдоха доходчиво вроде в в Параграфе 18.4 его Книги описано как пользоваться Function Objects. И пример работает, и если самому это дело использовать тоже работает нормально. Вот простой пример:
void Add7(int& out_Int)
{
out_Int += 7;
}
class AddNumber
{
public:
int m_iToAdd;
AddNumber(int in_iToAdd = 0)
{
m_iToAdd = in_iToAdd;
}
void operator()(int& out_Int)
{
out_Int += m_iToAdd;
}
};
class A
{
public:
std::vector < int > m_vData;
};
void main()
{
A tmp_a;
tmp_a.m_vData.push_back(7);
tmp_a.m_vData.push_back(5);
tmp_a.m_vData.push_back(6);
std::for_each(tmp_a.m_vData.begin(),tmp_a.m_vData.end(),Add7);
std::for_each(tmp_a.m_vData.begin(),tmp_a.m_vData.end(),AddNumber(13));
}
---
Но вот как только пытаюсь использовать их сам вот например таким образом:
typedef void (*TraveseFuncPtr) (int&);
void Add7(int& out_Int)
{
out_Int += 7;
}
class AddNumber
{
public:
int m_iToAdd;
AddNumber(int in_iToAdd = 0)
{
m_iToAdd = in_iToAdd;
}
void operator()(int& out_Int)
{
out_Int += m_iToAdd;
}
};
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]);
}
}
};
void main()
{
A tmp_a;
tmp_a.m_vData.push_back(7);
tmp_a.m_vData.push_back(5);
tmp_a.m_vData.push_back(6);
tmp_a.TraverseVector(Add7); // All ok.
tmp_a.TraverseVector(AddNumber(13)); //C2664
}
---
Сразу получаю облом.
error C2664: 'TraverseVector' : cannot convert parameter 1 from 'class AddNumber' to 'void (__cdecl *)(int &)'
No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
Пытался пробиться через дебри STL, но там тот же for_each принимает
КЛАСС (!) - параметр шаблона которым собственно и является. (Хотя при использовании for_each я явно ему параметр не передаю т.е. испльзую как обычную фунцкию).
Вот так. Кто что скажет?
|