我有一个棘手的语法错误,我无法弄清楚。我正在尝试运行一个函数委托,其中上下文是指向对象的指针。
语法错误:
((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)();
答案 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
无法支持的事情。)
你已经找到了解决方法。