クラスメソッドへのポインタを渡し、その関数をイテレータから呼び出したいとします。派生オブジェクトを含めると、以下のコードはコンパイルに失敗します。 クラス指定子にタイプ名(例:TC :: * pf)を使用しようとしましたが、これは機能しません。誰かがこの仕事をする方法を提案することはできますか?イテレータによる関数の呼び出しが派生オブジェクトでコンパイルに失敗する
#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;
}
あなたは(パブリックでもプライベートでもない)、単一のパラメータを持つ 'Derived'のコンストラクタを持っていない...コンパイラエラーが大きなヒントを与えますそれは本当に読む価値があります:) –
これは問題ではありませんが、余分なものが必要な場合を除き、 'std :: endl'を使用しないでください。 '' \ n ''は行を終わらせます。 –