使用std :: unique_ptr pimpl和显式默认析构函数

时间:2015-04-30 14:13:45

标签: c++ c++11 unique-ptr pimpl-idiom defaulted-functions

定义以下类时

class Foo 
{
public:
    Foo (void);
    ~Foo (void) = default;
protected:
    class FooImpl;
    std::unique_ptr <FooImpl> _impl;
//...
};

Foo::Foo (void) : _impl (std::make_unique <Foo> ()) {
}

我收到以下错误(icpc):

  

/home/toolworks/gcc/4.8.2/bin /../包括/ C ++ / 4.8.2 /比特/ unique_ptr.h(65):   错误:不允许不完整类型static_assert(sizeof(_Tp)&gt; 0,                              ^             检测期间:

     

实例化&#34; void std :: default_delete&lt; _Tp&gt; :: operator()(_ Tp *)   const [with _Tp = FooImpl]&#34;在第184行               实例化&#34; std :: unique_ptr&lt; _Tp,_Dp&gt; ::〜unique_ptr()[with _Tp = FooImpl,_Dp = std :: default_delete]&#34;在290号线   &#34; /home/toolworks/gcc/4.8.2/bin /../包括/ C ++ / 4.8.2 /比特/ shared_ptr_base.h&#34;               实例化&#34; void std :: _ Sp_counted_ptr&lt; _Ptr,_Lp&gt; :: _ M_dispose()[with _Ptr = Foo *,_ Lp = __ gnu_cxx :: _ S_atomic]&#34;在第286行   &#34; /home/toolworks/gcc/4.8.2/bin /../包括/ C ++ / 4.8.2 /比特/ shared_ptr_base.h&#34;               隐式生成&#34; std :: _ Sp_counted_ptr&lt; _Ptr,_Lp&gt; ::〜_Sp_counted_ptr()[with _Ptr = Foo *,_Lp = __ gnu_cxx :: _ S_atomic]&#34;在第286行   &#34; /home/toolworks/gcc/4.8.2/bin /../包括/ C ++ / 4.8.2 /比特/ shared_ptr_base.h&#34;               类的实例化&#34; std :: _ Sp_counted_ptr&lt; _Ptr,_Lp&gt; [with _Ptr = Foo *,_ Lp = __ gnu_cxx :: _ S_atomic]&#34;在第286行   &#34; /home/toolworks/gcc/4.8.2/bin /../包括/ C ++ / 4.8.2 /比特/ shared_ptr_base.h&#34;               实例化&#34; std :: _ Sp_counted_ptr&lt; _Ptr,_Lp&gt; :: _ Sp_counted_ptr(_Ptr)[with _Ptr = Foo *,_Lp = __ gnu_cxx :: _ S_atomic]&#34;在&#34; /home/toolworks/gcc/4.8.2/bin /../ include / c ++ / 4.8.2 / bits / shared_ptr_base.h&#34;的第452行;               实例化&#34; std :: __ shared_count&lt; _Lp&gt; :: __ shared_count(_Ptr)[与   _Lp = __ gnu_cxx :: _ S_atomic,_Ptr = Foo *]&#34;在&#34; /home/toolworks/gcc/4.8.2/bin /../ include / c ++ / 4.8.2 / bits / shared_ptr_base.h&#34;的第740行;               实例化&#34; std :: __ shared_ptr&lt; _Tp,_Lp&gt; :: __ shared_ptr(_Tp1 *)[with _Tp = Foo,_Lp = __ gnu_cxx :: _ S_atomic,_Tp1 = Foo]&#34;在&#34; /home/toolworks/gcc/4.8.2/bin /../ include / c ++ / 4.8.2 / bits / shared_ptr.h&#34;的第113行;               实例化&#34; std :: shared_ptr&lt; _Tp&gt; :: shared_ptr(_Tp1 *)[with _Tp = Foo,_Tp1 = Foo]&#34;在&#34; main.cc&#34;

的第...行

然而, 当我定义一个非默认的析构函数时,它会编译:

foo.h中

class Foo 
{
public:
    Foo (void);
    ~Foo (void);
protected:
    class FooImpl;
    std::unique_ptr <FooImpl> _impl;
//...
};

Foo.cc

Foo::~Foo (void) {

} 

它编译。 我在一些地方看到说&#34; =默认&#34;应该编译,它与隐式默认函数不是同一个类(我是c ++ 11的新手)。

那么,为什么没有第一个Foo编译?

注意:我&#39;不知道它是如何重复的,因为我问过默认析构函数,而不是默认析构函数

0 个答案:

没有答案