[英]No suitable constructor exists to convert from “dumb pointer” to “smart pointer”
struct A
{
A(int a);
};
struct B
{
B();
void b(std::shared_ptr<A> a);
};
int main()
{
A a(1);
B b;
b.b(&a);
}
所以我得到了這個錯誤,對不起,這是我第一次使用智能指針!
錯誤:
不存在將
"A *"
轉換為"std::tr1::shared_ptr<A>"
的合適構造函數
我該如何解決這個問題?
智能指針的全部意義在於擁有所有權。 也就是說,它負責釋放指向它的任何東西。 試圖告訴它管理已經由完全不同的系統管理的東西根本沒有意義。
在您的情況下, a
已經被自動管理,為什么還要由智能指針管理? 即使這有效,您也只是將自己設置為刪除它兩次,即 UB。
要么給它擁有的東西,比如new A(1)
,要么改變b
來操作它不擁有的東西。
其他人已經對您的代碼的設計錯誤大發雷霆,但不是代碼甚至無法編譯的真正問題。 shared_ptr
有一個接受原始指針的構造函數,但它被標記為explicit
,這意味着您必須顯式寫出您想要構造一個shared_ptr
實例。 您的 function 調用嘗試的是隱式執行該構造,由於顯式關鍵字,這是不允許的。
以下將編譯但給出未定義的行為,因為shared_ptr
將(嘗試) delete
駐留在堆棧上且不可刪除的 object:
b.b(shared_ptr<A>(&a)); // explicit construction
shared_ptr
的一個特殊特性是您可以向構造函數傳遞一個刪除器,當應該刪除擁有的指針時將調用該刪除器。 您可以只編寫和使用“noop”刪除器,它什么都不做; 以下不會調用未定義的行為,也不會嘗試刪除堆棧變量:
// outside of main
void noop_deleter(A*){/*do nothing*/}
// call...
b.b(shared_ptr<A>(&a, noop_deleter));
如果你有一個庫 API 絕對想要一個shared_ptr
但你想用一個堆棧變量調用它,那么這實際上是有用的。 不過,API 的設計是另一回事……
std::tr1::shared_ptr 有一個構造函數,允許傳遞給定的原始指針。 因此,如果您有一個指向 A 的指針,您將執行以下操作:
std::shared_ptr (pMyA)
但是在您的情況下,指向 A 的指針指向自動變量,而不是指向動態分配的 memory 資源,該資源可以在使用后刪除。
這樣的事情將是一個更好的用例:
class B
{
void b (shared_ptr <A> pA) {}
}
int main ()
{
shared_ptr<A> pA (new A);
B b;
b.b (pA);
...
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.