使用shared_ptr <void> </void>初始化struct

时间:2014-11-10 21:28:43

标签: c++ struct shared-ptr

我一直遇到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这样的事情,但我想我也可能有这样的错误。

感谢。

3 个答案:

答案 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*