Я застрял с ошибкой компиляции 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» может быть инициализирован с идиомой именованного параметра с использованием метода «has_funcPtr» класса «init», присоединенного к его конструктору, например: «init (). has_funcPtr (& function_name)».
- класс «пользователь» может хранить указатель на свой частный метод «func1» как частный член своего частного члена типа «элемент».
Таким образом, когда вызывается конкретный метод объекта "item" (для простоты я не включаю здесь эту длинную часть, поскольку она не имеет отношения к ошибке, а просто описывает цель этого фрагмента кода) этот метод может делать что-то и вызывать частный метод своего родительского объекта "user" через указатель на функцию (я надеюсь, что это достаточно ясно ...).
Теперь я думаю, что есть проблема с порядком инициализации объектов, но я не уверен, где и как это исправить. В частности, я подумал, что, поскольку метод "func1" не работает ни с одним членом класса "user", его ссылка может использоваться непосредственно в списке инициализации для инициализации объекта "init" и передачи его в "item". " объект.
Спасибо всем заранее