Passer une fonction membre comme argument d'une fonction (ici de std::transform)
Bonjour,
J'expose mon problème (je suis sous MSVC 8.0):
- je possède plusieurs classes NoeudXXX qui dérivent toutes de la classe Noeud.
Code:
1 2 3 4 5 6 7 8 9 10 11 12
|
typedef Noeud* pNoeud;
class Noeud
{
public:
// ...
virtual pNoeud clone(pNoeud pere) const;
private:
// ...
pNoeud m_pere;
} |
cette fonction membre clone est surchargée dans chaque classe dérivée et elle rend un pointeur sur une copie du Noeud. (La propriété m_pere du nouveau Noeud est fixée à pere).
- J'ai une classe dérivée NoeudOperation
Code:
1 2 3 4 5 6 7 8 9 10 11 12
| class NoeudOperation : public Noeud
{
public:
// ...
private:
// ...
void copie(const NoeudOperation& droite);
pNoeud cloneur(pNoeud n);
// ...
vector<pNoeud> m_enfants;
}; |
La fonction membre privée copie me sert pour le constructeur de copie et pour l'opérateur =.
Une partie de ma fonction copie est consacrée créer les clones des enfants et à les recopier dans le nouveau vecteur. Là je veux utiliser la fonction tranform des algorithmes de la STL (je pourrais faire autrement mais j'ai envie d'éclaircir l'affaire).
Code:
1 2 3 4 5 6 7 8 9 10 11
| pNoeud NoeudOperation::cloneur(pNoeud n)
{
return n->clone(this);
}
void NoeudOperation::copie(const NoeudOperation& droite)
{
// ...
m_enfants.clear(); // nécessaire ?
transform(droite.m_enfants.begin(), droite.m_enfants.end(), m_enfants.begin(), &NoeudOperation::cloneur);
} |
- Mais à la compilation, vc me sort une erreur
Citation:
error C2064: term does not evaluate to a function taking 1 arguments
sur
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
| // TEMPLATE FUNCTION transform WITH UNARY OP
template<class _InIt, class _OutIt, class _Fn1, class _InOutItCat>
inline
_OutIt _Transform(_InIt _First, _InIt _Last, _OutIt _Dest, _Fn1 _Func,
_InOutItCat, _Range_checked_iterator_tag)
{ // transform [_First, _Last) with _Func
_DEBUG_RANGE(_First, _Last);
_DEBUG_POINTER(_Dest);
_DEBUG_POINTER(_Func);
for (; _First != _Last; ++_First, ++_Dest)
*_Dest = _Func(*_First);
return (_Dest);
} |
Merci à vous d'avance ;)