语法错误:使用指针到对象调用成员函数指针

时间:2015-12-30 03:58:06

标签: c++ pointers delegates

我有一个棘手的语法错误,我无法弄清楚。我正在尝试运行一个函数委托,其中上下文是指向对象的指针。

语法错误:

((object)->*(ptrToMember)) // the compiler doesn't like the ->*
  

object的类型为Component*

     

ptrToMember的类型为void (Component::*EventCallback) ()

以下是语法错误的代码:

typedef void (Component::*EventCallback) ();

...

std::weak_ptr<Component> wc( mySharedPtr );
EventCallback ec = &Component::run;

((wc.lock())->*(ec))(); // syntax error
(wc.lock()->(*ec))(); // simpler version but still syntax error

// This is ok, but is there any significant time or memory involved in this reference object creation?
Component& wcc = *wc.lock();
(wcc.*ec)();

2 个答案:

答案 0 :(得分:1)

wc.lock()返回std::shared_ptr<Component>,但您希望它返回原始Component*指针。您无法拨打->*本身的std::shared_ptr。您必须向它询问它所持有的Component*指针,然后您可以在该指针上使用->*运算符,例如:

(wc.lock().get()->*ec)();

由于您正在处理可能在使用之前过期的std::weak_ptr,因此在尝试访问之前,应确保Component对象在锁定后实际可用:

if (auto sptr = wc.lock()) {
    (sptr.get()->*ec)();
}
else {
    // wc had expired
}

答案 1 :(得分:0)

wc.lock()的结果是shared_ptr。这是智能指针偏离哑指针的少数情况之一。 shared_ptr未实现operator ->*,因此您的第一个语法无效。 (这不是语法错误,您只是尝试做shared_ptr无法支持的事情。)

你已经找到了解决方法。