猿问

如何在只有受保护或私有构造函数的类上调用:std:make_Shared?

如何在只有受保护或私有构造函数的类上调用:std:make_Shared?

我的代码不起作用,但我认为其意图是明确的:

testmakeshared.cpp

#include <memory>class A {
 public:
   static ::std::shared_ptr<A> create() {
      return ::std::make_shared<A>();
   }

 protected:
   A() {}
   A(const A &) = delete;
   const A &operator =(const A &) = delete;};::std::shared_ptr<A> foo(){
   return A::create();}

但是,当我编译它时,我会得到这个错误:

g++ -std=c++0x -march=native -mtune=native -O3 -Wall testmakeshared.cppIn file included from /usr/lib/gcc/x86_64-redhat-linux/4.6.1/../../../../i
nclude/c++/4.6.1/bits/shared_ptr.h:52:0,
                 from /usr/lib/gcc/x86_64-redhat-linux/4.6.1/../../../../include/c++/4.6.1/memory:86,++/4.6.1/bits/shared_ptr_base.h:
                 400:2: error: within this contextCompilation exited abnormally with code 1 at Tue Nov 15 07:32:58

这条消息基本上是说,模板实例化堆栈中的一些随机方法从::std::make_shared无法访问构造函数,因为它是受保护的。

但我真的想用这两种方法::std::make_shared并防止任何人创建这个类的对象,而该对象不是::std::shared_ptr..有办法做到这一点吗?



红颜莎娜
浏览 372回答 3
3回答

开心每一天1111

考虑到对.的要求std::make_shared在20.7.2.2.6 Shared_PTR创建[util.Smart ptr.shared.create]中,第1段:要求:表达::new (pv) T(std::forward<Args>(args)...),在哪里pv有型void*并指向适合保存类型对象的存储。T,应形成良好的结构。A应为分配器(17.6.3.5)。的复制构造函数和析构函数。A不得抛出异常。因为这个要求是无条件地用这个表达方式来指定的,而且像范围这样的东西也没有被考虑在内,我认为像友谊这样的技巧是正确的。一个简单的解决方案是从A..这不需要A接口,甚至多态类型。//&nbsp;interface&nbsp;in&nbsp;headerstd::shared_ptr<A>&nbsp;make_a();//&nbsp;implementation&nbsp;in&nbsp;sourcenamespace&nbsp;{struct&nbsp;concrete_A:&nbsp;public&nbsp;A&nbsp;{};}&nbsp; //&nbsp;namespacestd::shared_ptr<A>make_a(){ &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;std::make_shared<concrete_A>();}
随时随地看视频慕课网APP
我要回答