У меня была эта проблема некоторое время назад, и я сдался, но в последнее время она возвратилась.
#include
class element2D;
class node2D
{
public:
void (element2D::*FunctionPtr)();
void otherMethod()
{ std::cout << "hello" << std::endl;
((this)->*(this->FunctionPtr))(); //ERROR<-------------------
}
};
class element2D
{
public:
node2D myNode;
void doSomething(){ std::cout << "do something" << std::endl; }
};
int main()
{
element2D myElement;
myElement.myNode.FunctionPtr = &element2D::doSomething; //OK
((myElement).*(myElement.myNode.FunctionPtr))(); //OK
return 0;
}
Я получаю ошибку в отмеченной строке:
pointer to member type 'void (element2D::)()' incompatible with object type 'node2D'
Я был бы действительно благодарен за справку. Был подобный вопрос сегодня, который частично помог мне: ссылка. Но это, кажется, не полное решение моей проблемы.
На самом деле эти две проблемы имеют только одно различие - точка, где функция вызвана.
Спасибо за внимание
"this" является указателем на node2D, но FunctionPtr ссылается на член element2D - это и есть ошибка.
#if 0 // сломанная версия
void otherMethod()
{ std::cout << "hello" << std::endl;
((this)->*(this->FunctionPtr))(); //ERROR<-------------------
}
#else // исправленная версия
void otherMethod( element2D * that )
{ std::cout << "hello" << std::endl;
((that)->*(this->FunctionPtr))();
}
#endif
Затем вы вызываете его с помощью чего-то вроде:
myElement.myNode.otherMethod( &myElement );
Есть вещи, которые вы могли бы сделать, чтобы улучшить это, но это должно помочь вам начать.
Вам понадобится указатель на объект element2D, если вы хотите вызвать указатель на член element2D. Рассмотрите возможность использования Boost.Function или Boost.Signals2 для тех функций, которые вам нужны.