我一直遇到no matching constructor for initialization of 'std::shared_ptr<void>'
这个错误的错误,但我不知道从哪里开始。
以下是我正在使用的内容。
#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;
}
我正在尝试使用类型为shared_ptr
的{{1}}制作通用容器。我打算对类型进行切换,然后将有效负载转换为适当的类型。
我想我可以做void
这样的事情,但我想我也可能有这样的错误。
感谢。
答案 0 :(得分:2)
您正尝试使用指向void
的指针初始化指向const void
的指针,这确实是非法的。指针的“智能性”无关紧要,对于普通指针也会失败。
您需要将payload
的类型更改为std::shared_ptr<const void>
,或者(可能更符合您的实际需要)将p
的类型更改为void*
。
但请注意,虽然这在技术上可以解决眼前的问题,但它可以引入更基本的问题。在这种设计下,payload
对它所指向的实际类型一无所知,因此当最后一个引用退出时,它将不调用Data
的析构函数。您可能应该重新考虑整个设计以使用适当类型的指针。
答案 1 :(得分:2)
预先注意:看看Boost.Any,它可能会做你想要的。
那就是说,你不能只在shared_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) { }
};
现在,好好发现为什么这是一个用脚射击自己的方法。
答案 2 :(得分:1)
您可以使用模板并撰写shared_ptr<T>
如果你不想使用模板,那么你应该定义一个抽象类,你将放在容器中的所有项都应该从该类派生(作为java接口)
但我强烈建议您不要使用void*