无法由此创建 boost::shared_ptr
Can't created a boost::shared_ptr from this
假设我有以下摘要 Class A。现在我正在尝试从 Class A 内部创建一个 shared_ptr 到 A。所以在 A 中我有以下功能:
class A {
void A::setupArguments() const {
ext::shared_ptr<A> ptr = ext::shared_ptr<A>(this);
}
}
编译时报错
Error C2440 'initializing': cannot convert from 'Y *' to 'A *
当shared_ptr函数定义为:
template<class Y>
explicit shared_ptr( Y * p ): px( p ), pn() // Y must be complete
{
boost::detail::sp_pointer_construct( this, p, pn );
}
我在另一个 post 中读到,这与 shared_ptr 函数是显式的有关,其中参数 p 必须严格属于 Y* 类型。在这种情况下,Y 引用 Class A,因此通过传入“this”,“this”是否已经足够明确,因为它是 A* 类型?我知道解决方案是使用 std::enable_shared_from_this 但我只是想了解为什么这行不通。例如,如果我们执行以下操作,它将起作用
ext::shared_ptr<A>(new A())
但是 new A() return 不是与“this”相同的类型吗?(两者都是 returns 指向 A 的指针)那么为什么 new A() return 工作而不是“this”?
由于 setupArguments
是 const
限定函数,因此 this
是 const A*
类型。并且 const A*
不能转换为 A*
所以编译失败。
您需要使用 shared_ptr<const A>
或删除 const
限定符。
给出的完整错误应该如下所示:
error C2440: 'initializing': cannot convert from 'Y *' to 'A *'
with
[
Y=const A
]
note: Conversion loses qualifiers
OT:小心从 this
构造 shared_ptr
,因为它可能导致双重删除。考虑使用 boost::enable_shared_from_this
假设我有以下摘要 Class A。现在我正在尝试从 Class A 内部创建一个 shared_ptr 到 A。所以在 A 中我有以下功能:
class A {
void A::setupArguments() const {
ext::shared_ptr<A> ptr = ext::shared_ptr<A>(this);
}
}
编译时报错
Error C2440 'initializing': cannot convert from 'Y *' to 'A *
当shared_ptr函数定义为:
template<class Y>
explicit shared_ptr( Y * p ): px( p ), pn() // Y must be complete
{
boost::detail::sp_pointer_construct( this, p, pn );
}
我在另一个 post 中读到,这与 shared_ptr 函数是显式的有关,其中参数 p 必须严格属于 Y* 类型。在这种情况下,Y 引用 Class A,因此通过传入“this”,“this”是否已经足够明确,因为它是 A* 类型?我知道解决方案是使用 std::enable_shared_from_this 但我只是想了解为什么这行不通。例如,如果我们执行以下操作,它将起作用
ext::shared_ptr<A>(new A())
但是 new A() return 不是与“this”相同的类型吗?(两者都是 returns 指向 A 的指针)那么为什么 new A() return 工作而不是“this”?
由于 setupArguments
是 const
限定函数,因此 this
是 const A*
类型。并且 const A*
不能转换为 A*
所以编译失败。
您需要使用 shared_ptr<const A>
或删除 const
限定符。
给出的完整错误应该如下所示:
error C2440: 'initializing': cannot convert from 'Y *' to 'A *'
with
[
Y=const A
]
note: Conversion loses qualifiers
OT:小心从 this
构造 shared_ptr
,因为它可能导致双重删除。考虑使用 boost::enable_shared_from_this