Ich möchte einen Zeiger auf eine Klassenmethode übergeben und diese Funktion von einem Iterator aufrufen. Der folgende Code kann nicht kompiliert werden, wenn ich ein abgeleitetes Objekt einschließe. Ich habe versucht, einen Typnamen für den Klassenspezifizierer (z. B. TC :: * pf) zu verwenden, aber das funktioniert nicht. Kann jemand vorschlagen, wie das funktioniert?Aufruf der Funktion durch Iterator kann nicht auf abgeleiteten Objekt kompilieren
#include <iostream>
#include <vector>
#include <algorithm>
using std::cout;
using std::endl;
using std::vector;
class Base {
public:
Base(int bval) : bval_(bval) { }
virtual void print() {
cout << "Base: bval:" << bval_ << endl;
}
protected:
int bval_;
};
class Derived : public Base {
Derived(int bval, int dval) : Base(bval), dval_(dval) { }
virtual void print() {
cout << "Derived: bval:" << bval_ << " dval:" << dval_ << endl;
}
private:
int dval_;
};
typedef vector<Base*> MyVecType;
typedef MyVecType::iterator MyVecTypeIter;
template <typename T>
void testFunc(MyVecType& v, T (Base::*pf)()) {
for (MyVecTypeIter iter = v.begin(); iter != v.end(); ++iter) {
((*iter)->*pf)();
}
}
int main() {
MyVecType bvec;
bvec.push_back(new Base(44));
bvec.push_back(new Base(55));
// above compiles and runs ok, but this fails to compile
// with 'no matching function' error:
bvec.push_back(new Derived(66));
testFunc(bvec, &Base::print);
return 0;
}
Sie haben kein Konstruktor von 'Derived' mit einem einzigen Parameter (weder öffentlich noch privat) ... geben Compilerfehler einen großen Hinweis Es ist wirklich lesenswert :) –
Das ist nicht das Problem, aber verwenden Sie nicht 'std :: endl', es sei denn, Sie benötigen die zusätzlichen Sachen, die es tut. '\ n'' beendet eine Zeile. –