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
构造函数之前就丢失了。