一、前言
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
}