簡體   English   中英

語法錯誤:使用指向對象的指針調用成員函數指針

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM