2016-11-23 1 views
0

クラスメソッドへのポインタを渡し、その関数をイテレータから呼び出したいとします。派生オブジェクトを含めると、以下のコードはコンパイルに失敗します。 クラス指定子にタイプ名(例: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; 

} 
+1

あなたは(パブリックでもプライベートでもない)、単一のパラメータを持つ 'Derived'のコンストラクタを持っていない...コンパイラエラーが大きなヒントを与えますそれは本当に読む価値があります:) –

+0

これは問題ではありませんが、余分なものが必要な場合を除き、 'std :: endl'を使用しないでください。 '' \ n ''は行を終わらせます。 –

答えて

1

ライン

bvec.push_back(new Derived(66)); 

派生クラスのコンストラクタがプライベートであり、2つのint型の引数を取るように定義されているため、コンパイラはありません。

それを修正し、それをコンパイルして実行します:

http://cpp.sh/9nrkc

+0

ありがとうございます - 私は実際に私の質問を台無しにしました。それは私が投稿するつもりだった別のエラーだった。派生クラスにしかないメソッドで上記のコードを使用する方法がある場合でした。私はそれを動作させることができる唯一の方法は、私はむしろやっていないが、周りに何か方法があるかわからない、基本クラスでいくつかのデフォルトの実装を持っている。 – ark262

+0

また、基底クラスで純粋仮想関数を使用して抽象クラスにし、派生クラスにそれを実装させることもできます。 – GameSalutes

関連する問題