2016-03-26 8 views
0

異なるタイプのコンテナテンプレートを作成しています。タイプの1つは、対象となるshared_ptrです。だから私は、関数の引数としてメソッドへのポインタを渡すしようとしているが、私はこのエラーを得たm個のオブジェクトのメソッドを呼び出すことオペランド->.ための回避重複コードのため:テンプレートクラスメソッドの引数としてメソッドポインタを渡す方法

error: invalid use of non-static member function 'void A::show()' 
{ doOperation(U::show); } 

コード:

template <typename T, typename U> 
class MepVector 
{ 
private: 
    typedef void(U::*Operation)(); 
public: 
    MepVector() {} 

    void doOperation(Operation operation) 
    { 
     for(const auto& t : mepVector_) 
     { 
      (t.*operation)(); 
     } 
    } 

    void add(T t) 
    { mepVector_.push_back(t); } 

    void show() 
    { doOperation(U::show); } 


private: 
    std::vector<T> mepVector_; 
}; 

class A 
{ 
    public: 
    A() {}; 
    void show() 
    { cout<<"udalo sie!"<<endl; } 
}; 

int main() { 
    MepVector<A,A> myVector; 

    myVector.add(A()); 

    myVector.show(); 

    return 0; 
} 

Iドンしたくない。A::show()static

答えて

3

変更、それに:可変クラスインスタンスの関数へのポインタがある

for(const auto& t : mepVector_) 
    { 
     (t.*operation)(); 
    } 

operationので、これを変更する必要があり、次のいずれか

void show() 
{ doOperation(&U::show); } 

はしかし、あなたはまたの第2の問題を持っています〜に:

for(auto& t : mepVector_) 
    { 
     (t.*operation)(); 
    } 

またはOperationが必要ですそれに応じて再定義:一緒A::show年代と

typedef void(U::*Operation)() const; 

ものconstメソッドの関数である:

void show() const 
{ } 
+0

おかげで、作品 – user3191398

0

まず、U::show-doOperation(&U::show);のアドレスを明示的に指定する必要があります。コンパイラは、関数がstaticのように使用しようとしていると考えています。

第2に、(t.*operation)();const auto& tと、A::showconst修飾子を指定してコールしようとしています。 A::showOperationtypedefconstのいずれかを使用するか、auto& tを使用してください。

+0

おかげで、それはそれが動作 – user3191398

関連する問題