不存在合适的构造函数来将“哑指针”转换为“智能指针”

||
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>\"
我该如何解决这个问题!     
已邀请:
其他人已经在抱怨您的代码的设计错误,但并不是为什么代码甚至无法编译的真正问题。 “ 3”有一个接受原始指针的构造函数,但标记为“ 4”,这意味着您必须明确地写出要构造“ 3”实例的内容。您的函数调用尝试的是隐式地进行该构造,由于显式关键字而不允许这样做。 以下将编译但给出未定义的行为,因为
shared_ptr
将(试图)
delete
一个驻留在堆栈上且因此不可删除的对象:
b.b(shared_ptr<A>(&a)); // explicit construction
ѭ3的一个特殊特性是,您可以向构造函数传递一个删除器,该删除器在应删除拥有的指针时将被调用。您可以只编写和使用一个\“ noop \”删除程序,该删除程序什么也不做。以下内容不会调用未定义的行为,也不会尝试删除堆栈变量:
// outside of main
void noop_deleter(A*){/*do nothing*/}

 // call...
b.b(shared_ptr<A>(&a, noop_deleter));
实际上,如果您有一个绝对需要a3ѭ的库API,但又想使用堆栈变量来调用它,则实际上有一个用途。该API的设计不过是另一回事...     
智能指针的全部重点是拥有所有权。也就是说,它负责对其所指向的内容的重新分配。试图告诉它去管理已经由一个完全不同的系统管理的事务根本没有意义。 在您的情况下,ѭ12已被自动管理,为什么还要由智能指针进行管理?即使这样,您也可以将自己设置为两次删除,即UB。 给它一些拥有的东西,例如
new A(1)
,或更改
b
以对其不拥有的东西进行操作。     
std :: tr1 :: shared_ptr具有一个构造函数,该构造函数可以传递给定的原始指针。因此,如果您有一个指向A的指针,则可以执行以下操作: std :: shared_ptr(pMyA) 但是在您的情况下,指向A的指针指向自动变量,而不指向动态分配的内存资源,使用后可以将其删除。 这样的事情将是一个更好的用例:
class B
{
  void b (shared_ptr <A> pA) {}
}

int main ()
{
  shared_ptr<A> pA (new A);
  B b;
  b.b (pA);
  ...
}
    

要回复问题请先登录注册