模板基类

时间:2017-06-04 16:54:08

标签: c++ language-lawyer base-class incomplete-type template-instantiation

请从设计的角度忽略可疑的继承模式。谢谢:)

考虑以下情况:

#include <memory>

struct Foo;

struct Bar : std::unique_ptr<Foo> {
    ~Bar();
};

int main() {
    Bar b;
}

在GCC和Clang中,将其编译为独立的TU会引发错误:

In instantiation of 'void std::default_delete<_Tp>::operator()(_Tp*) const [with _Tp = Foo]':
  required from 'std::unique_ptr<_Tp, _Dp>::~unique_ptr() [with _Tp = Foo; _Dp = std::default_delete<Foo>]'
error: invalid application of 'sizeof' to incomplete type 'Foo'
  static_assert(sizeof(_Tp)>0,
                      ^

这是GCC的,Clang的一个是相似的,都指向struct Bar的定义。此外,在 main()之后添加缺少的定义可修复错误:

// Same as above

struct Foo { };

Bar::~Bar() = default;

std::unique_ptr的析构函数在定义Bar时需要实例化,这对我来说听起来不对,因为它只被Bar的析构函数调用了外的线。

我发现甚至更奇怪的是在之后添加定义,其中它们不应该被访问,显然可以解决问题。

第一个片段应该是正确的,如果没有,为什么?第二个修复它的是什么?

0 个答案:

没有答案