2017-09-07 112 views
0

我想返回一個std::vector內的實體,但編譯器告訴我,我正在引用已刪除的函數。引用已刪除的函數陣列

vector<unique_ptr<Node>> children;  //member of a class 

unique_ptr<Node> Node::selectNext() { //function for a class 
    for (int i = 0; i < children.size(); i++) { 
     if (children[i]->getUI().mouseSelect()) 
      return children[i];   //Problem is in this return statement 
    } 
    return nullptr; 
} 

我相信編譯器與智能指針衝突。

這可能是一個相對容易解決的問題,但我不確定我做錯了什麼。這個問題可能比這個更大,因爲這個類是一個節點類。

+1

您需要給我們*完整*代碼來重現此問題。編譯器錯誤也是你應該包含的一個非常基本的東西。我們看不到您的顯示器。 – cdhowie

+1

您正在嘗試複製不可能的指針。修復取決於你實際需要的東西。 – Sopel

回答

4

您不能共享唯一的ptrs。

Node* Node::selectNext() { //function for a class 
    for (int i = 0; i < children.size(); i++) { 
    if (children[i]->getUI().mouseSelect()) 
     return children[i].get(); 
    } 
    return nullptr; 
} 
+0

非常感謝!當我想到這件事時,這實際上很有意義。 –

+0

如果你打算傳遞Node指針,最好使用'std :: shared_ptr'而不是'std :: unique_ptr' –

+0

@RemyLebeau不,共享指針不能解決「你將會傳遞它」問題。那麼,它像「正則表達式」解決HTML解析問題一樣「解決」它。共享指針意味着你明確希望這個對象的生命週期處於共享管理之下,這在99/100的情況下不是一個簡單的假設。由樹管理的樹中節點的生命週期是一個簡單的模型。所有懸掛指針的結合是一個非常複雜的模型。 – Yakk