定义以下类时
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;
的第...行
然而, 当我定义一个非默认的析构函数时,它会编译:
class Foo
{
public:
Foo (void);
~Foo (void);
protected:
class FooImpl;
std::unique_ptr <FooImpl> _impl;
//...
};
Foo::~Foo (void) {
}
它编译。 我在一些地方看到说&#34; =默认&#34;应该编译,它与隐式默认函数不是同一个类(我是c ++ 11的新手)。
那么,为什么没有第一个Foo编译?
注意:我&#39;不知道它是如何重复的,因为我问过默认析构函数,而不是默认析构函数