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.
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).
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; }
- J'ai une classe dérivée NoeudOperation
La fonction membre privée copie me sert pour le constructeur de copie et pour l'opérateur =.
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; };
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
surerror C2064: term does not evaluate to a function taking 1 arguments
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![]()
Partager