關於error c2664和enable_shared_from_this

一、前言

  error c2664 是一個常見的編譯錯誤,通常提示爲參數xxx不能轉換成xxx,根據不同的場景有不同的原因。一般來說是由於不能隱性轉化類型導致。本文分析的是一個關於使用shared_ptr導致的該編譯錯誤。

二、示例

示例代碼如下:

struct S
{
  shared_ptr<S> dangerous()
  {
     return shared_ptr<S>(this);   // don't do this!
  }
};

int main()
{
   shared_ptr<S> sp1(new S);
   shared_ptr<S> sp2 = sp1->dangerous();
   return 0;
}

在這種情況下,由於shared_ptr嚴禁this指針的使用:可能會導致計數錯誤,因此程序會報錯,正確的使用方式爲:

class Y: public enable_shared_from_this<Y>
{
public:

    shared_ptr<Y> f()
    {
        return shared_from_this();
    }
}

int main()
{
    shared_ptr<Y> p(new Y);
    shared_ptr<Y> q = p->f();
    assert(p == q);
    assert(!(p < q || q < p)); // p and q must share ownership
}
發佈了106 篇原創文章 · 獲贊 14 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章