4

以下のクラスを定義する場合

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/../include/c++/4.8.2/bits/unique_ptr.h(65): エラー: 不完全な型は許可されていません static_assert(sizeof(_Tp)>0, ^次の期間に検出されました:

184 行目の「void std::default_delete<_Tp>::operator()(_Tp *) const [with _Tp=FooImpl]」のインスタンス化 「std::unique_ptr<_Tp, _Dp>::~unique_ptr() [ with _Tp=FooImpl, _Dp=std::default_delete]" /home/toolworks/gcc/4.8.2/bin/../include/c++/4.8.2/bits/shared_ptr_base.h" インスタンス化の 290 行目"/home/toolworks/gcc/4.8.2/bin/. ./include/c++/4.8.2/bits/shared_ptr_base.h" "std::_Sp_counted_ptr<_Ptr, _Lp>::~_Sp_counted_ptr() [with _Ptr=Foo *, _Lp=__gnu_cxx::_S_atomic]" の暗黙的な生成「/home/toolworks/gcc/4.8.2/bin/../include/c++/4.8.2/bits/shared_ptr_base.h」の286行目「/home/toolworks/gcc/4.8.2/bin/../include」の 286 行目のクラス「std::_Sp_counted_ptr<_Ptr, _Lp> [with _Ptr=Foo *, _Lp=__gnu_cxx::_S_atomic]」のインスタンス化/c++/4.8.2/bits/shared_ptr_base.h" の 452 行目の "std::_Sp_counted_ptr<_Ptr, _Lp>::_Sp_counted_ptr(_Ptr) [with _Ptr=Foo *, _Lp=__gnu_cxx::_S_atomic]" のインスタンス化"/home/toolworks/gcc/4.8.2/bin/../include/c++/4.8.2/bits/shared_ptr_base.h" "std::__shared_count<_Lp>::__shared_count(_Ptr) のインスタンス化 [ with _Lp =__gnu_cxx::_S_atomic, _Ptr=Foo *]" "/home/toolworks/gcc/4.8.2/bin/../include/c++/4.8.2/bits/shared_ptr_base.h" の 740 行目で " std::__shared_ptr<_Tp, _Lp>::__shared_ptr(_Tp1 *) [with _Tp=Foo, _Lp=__gnu_cxx::_S_atomic,「std::shared_ptr<_Tp> ::shared_ptr(_Tp1 *) [with _Tp=Foo, _Tp1=Foo]" "main.cc" の ... 行

ただし、デフォルト以外のデストラクタを定義すると、次のようにコンパイルされます。

フー。

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

Foo.cc

Foo::~Foo (void) {

} 

コンパイルします。「= default」をコンパイルする必要があると述べた場所をいくつか見ましたが、それは暗黙のデフォルト関数と同じクラスではありません(私はc ++ 11が初めてです)。

では、最初の Foo がコンパイルされないのはなぜでしょうか?

注:デフォルトのデストラクタではなく、デフォルトのデストラクタについて尋ねたので、それがどのように複製されるかわかりません

4

0 に答える 0