[英]Syntax Error: Call Member Function Pointer using Pointer to Object
我有一个棘手的语法错误,无法弄清。 我正在尝试运行一个函数委托,其中上下文是指向对象的指针。
语法错误:
((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)();
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
}
wc.lock()
的结果是shared_ptr
。 这是智能指针偏离哑指针的少数情况之一。 shared_ptr
没有实现operator ->*
,因此您的第一种语法无法工作。 (这不是语法错误,您只是在尝试做shared_ptr
不支持的操作。)
不过,您已经找到了解决方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.