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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    error C2064: term does not evaluate to a function taking 1 arguments
    sur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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