Frage

Dies ist die bereitgestellte Funktion Vorlage ich zu verwenden ist versucht:

template <class Process, class BTNode>
void postorder(Process f, BTNode* node_ptr)
{
   if (node_ptr != 0)
   {
      postorder( f, node_ptr->left() );
      postorder( f, node_ptr->right() );
      f( node_ptr->data() );
   }
}

Das ist mein Ruf, und die Funktion Ich bin übergeben:

void city_db::print_bst() {
   postorder(&city_db::print, head);
}

void city_db::print(city_record target)
{
   std::cout << target.get_code();
}

Dies ist die Kompilierung (G ++) Fehler erhalte ich:

  

CityDb.cpp: 85: instanziiert aus   hier

     

BinTree.template: 80: Fehler: müssen verwenden   oder ‚.‘ ‚-> ‘ nennen   pointer-to-Elementfunktion in ‚f   (...)‘

     

make: *** [CityDb.o] Fehler 1

Dies ist in Bezug auf die Linie f( node_ptr->data() ); in der Funktion Vorlage.

Dies ist für ein Projekt Datenstruktur. Die Zuordnung wurde modifiziert, so dass wir nicht eine Funktion an eine Funktion übergeben müssen, aber ich habe in dieser seit geraumer Zeit interessiert, und ich fühle mich wie ich es fast hier haben. Ich habe erschöpft Google und Lab TA, also wenn Stackoverflow Ideen hat, würden sie sehr geschätzt.

War es hilfreich?

Lösung

Ihr Problem ist, dass Postorder ein Funktionsobjekt übernimmt, die auf diese Weise aufgerufen werden muss:

f(arg);

Sie passieren in einem Zeiger auf Elementfunktion. Sie sollen zuerst nennen mem_fun, um eine Funktion Objekt aus dem Zeiger auf ein Element zu machen:

std::mem_fun(&city_db::print)

Die zurückFunktionsObjekt nimmt zwei Argumente: den Zeiger auf einen city_db (der implizite dieser Zeiger), und das Objekt gedruckt werden soll. Sie können die erste bis diese mit bind1st binden, wie folgt aus:

std::bind1st(std::mem_fun(&city_db::print), this)

Und jetzt sollten Sie in der Lage sein zu rufen Postorder darauf:

postorder(std::bind1st(std::mem_fun(&city_db::print), this), head);

Andere Tipps

Sie müssen eine Instanz von city_db print rufen.

Was Sie vorbei ist ein Zeiger auf eine Member-Funktion (man denke an ihn als einen Schlitz in der V-Tabelle), aber Sie müssen auch einen this Zeiger. Man könnte dies als ein anderes Argument an die postorder Funktion übergeben.

template <class Object, class Process, class BTNode>
void postorder(Object* obj, Process f, BTNode* node_ptr)
{
   if (node_ptr != 0)
   {
      postorder(obj, f, node_ptr->left() );
      postorder(obj, f, node_ptr->right() );
      ((obj)->*(f))( node_ptr->data() );
   }
}

Siehe C ++ FAQ Lite

Sie müssen entweder auf city_db :: print () statisch oder bieten eine Stadt _db Objekt machen.

Wie schon geschrieben

void city_db::print(city_record target)
{
   std::cout << target.get_code();
}

hängt nicht von dem Klassenstaat. Erklären Sie es als eine statische Funktion und Compiler nicht brauchen this Zeiger zu nennen. FAQ zum Thema.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top