C++ 使用共享资源初始化结构\u ptr<;无效>;

C++ 使用共享资源初始化结构\u ptr<;无效>;,c++,struct,shared-ptr,C++,Struct,Shared Ptr,我一直遇到一个错误,没有匹配的构造函数来初始化'std::shared_ptr',这是有道理的,但我不知道从哪里开始 这就是我的工作 #include <memory> s

我一直遇到一个错误,
没有匹配的构造函数来初始化'std::shared_ptr'
,这是有道理的,但我不知道从哪里开始

这就是我的工作

#include <memory>                                                                                                                                                             

struct Container {                                                             
  int type;                                                                    
  std::shared_ptr<void> payload;                                               

  Container(int t, const void *p) : type(t), payload(p) { }                    
};                                                                             

int main() {                                                                   
  return 0;                                                                    
}
#包括
结构容器{
int型;
std::共享的ptr有效载荷;
容器(intt,constvoid*p):类型(t),有效载荷(p){}
};                                                                             
int main(){
返回0;
}
我正在尝试使用类型为
void
shared\u ptr
创建一个通用容器。我打算在类型上做一个切换,然后将有效负载转换为适当的类型

我想我可以做一些事情,比如
Container ctn(1,newdata())

谢谢。

您试图用指向
const void
的指针初始化指向
void
的指针,这确实是非法的。指针的“智能性”并不重要,普通指针也会失败

您需要将
有效负载的类型更改为
std::shared_ptr
,或者(可能更符合您的实际需要)将
p
的类型更改为
void*



然而,请注意,虽然这将从技术上解决眼前的问题,但它可以引入一个更基本的问题。在这种设计下,
payload
对它所指向的实际类型一无所知,因此当最后一个引用消失时,它不会调用
数据的析构函数。您可能应该重新考虑整个设计,以使用适当类型的指针。

您可以使用模板并编写
shared\u ptr

如果您不想使用模板,那么您应该定义一个抽象类,并且您将放入容器中的所有项都应该从该类派生(作为java接口)


但我强烈建议您不要使用
void*
预先注意:看看Boost.Any,它可能会满足您的需求

也就是说,不能只在共享的_ptr中存储一个void指针,因为对void指针执行delete操作不起作用。因此,shared_ptr重载其构造函数,以便为指针的实际类型创建正确的删除器。您可以使用模板构造函数执行相同的操作:

struct Container {
    int type;
    std::shared_ptr<void> payload;
    template<typename T>
      Container(int t, T* p) : type(t), payload(p) { }
};
struct容器{
int型;
std::共享的ptr有效载荷;
模板
容器(intt,t*p):类型(t),有效载荷(p){}
};

现在,找出为什么这是一个射中你自己的脚的配方,并从中获得乐趣。

只要高兴这个问题阻止了你继续进行这个设计。例如,Bertrand Meyer决定在Eiffel中不支持枚举类型,只是为了阻止您的设计。这太糟糕了,是一种极端的反模式,与面向对象完全相反。现在忘记
void*
指针。使用标准库容器。
我正在尝试使用共享的\u ptr创建一个通用容器。
确定<代码>带有已通过模板解决的void类型
——删除
void*
。C++不是代码> C>代码>,我从顶部答案中了解到,SyrdYPPTR调用正确的析构函数。@ Grashlok调用正确的析构函数,如果您告诉它要用哪个构造函数调用它,请用指向正确类型的指针。在您的情况下,类型信息在到达
共享\u ptr
构造函数之前就丢失了。