[英]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.