おそらく実際には「従来型」ではないことをしているときに、C++ コンパイル エラーが発生しました。簡単にするために、使用しようとしているメカニズムを読みやすい方法で書き直し、同じ問題が発生することを確認しました。
まず、コードは次のとおりです。
test.h // - - C++ - -
template <typename MODULE> class item;
template <typename MODULE>
class init {
public:
typedef int (MODULE::*funcPtr)(int);
private:
funcPtr m_fp;
public:
init& has_funcPtr(funcPtr fp) { m_fp = fp;}
init() {}
virtual ~init() {}
private:
friend class item<MODULE>;
};
template <typename MODULE>
class item {
public:
typedef int (MODULE::*funcPtr)(int);
private:
funcPtr m_fp;
public:
item(init<MODULE> params) : m_fp(params.m_fp) {}
virtual ~item() {}
};
class user {
public:
typedef init<user>::funcPtr funcPtr;
private:
// Method CB
int func1(int i);
// Item member
item<user> m_item;
public:
user();
virtual ~user();
};
test.cpp // - - C++ - -
#include "test.h"
user::user() : m_item(init<user>().has_funcPtr(this->func1) ) {}
int user::func1(int i) {return 1;}
ここにエラーがあります:
/test.cpp:5:59: error: invalid use of non-static member function
user::user() : m_item(init<user>().has_funcPtr(this->func1) ) {
^
したがって、これが私が望むものを達成するための最良の方法であるかどうかはわかりません (おそらくそうではありませんが、他の提案があれば大歓迎です)。しかし、私の目標は、それを機能させるか、なぜ機能しないのかを正確に理解することです。そこから何かを学べるように!
基本的な考え方は次のとおりです。
- クラス「item」は、「init().has_funcPtr(&function_name)」のようにコンストラクターに連結されたクラス「init」のメソッド「has_funcPtr」を使用して、名前付きパラメーターイディオムで初期化できます。
- クラス "user" は、そのプライベート メソッド "func1" へのポインタを、型 "item" のプライベート メンバのプライベート メンバとして格納できます。
このようにして、オブジェクト「項目」の特定のメソッドが呼び出されたとき (簡単にするために、この長い部分はエラーとは関係がないため、ここには含めませんが、このコード スニペットの目的を説明するだけです)そのメソッドは、関数へのポインターを介して、何かを実行し、その親オブジェクト「ユーザー」のプライベートメソッドを呼び出すことができます(これが十分に明確であることを願っています...)。
現在、オブジェクトの初期化の順序に問題があると思いますが、どこでどのように修正すればよいかわかりません。特に、「func1」メソッドはクラス「user」のどのメンバーでも動作しないため、その参照を初期化リストで直接使用して「init」オブジェクトを初期化し、それを「item」にフィードできると考えました" 物体。
よろしくお願いします