如何转发声明boost智能ptr

How to forward declare boost smart ptr?

本文关键字:声明 boost 智能 ptr 转发 何转发      更新时间:2023-10-16

此代码编译失败:

namespace boost
{
  template<class T> class scoped_ptr;
}
namespace FooNamespace
{
class FooClass
{
  boost::scoped_ptr<FooType> foo;
};
}

g++表示:error: field ‘foo’ has incomplete type

我认为这是可以的,因为我从实际的boost头文件复制了scope_ptr声明。。。我搞砸了什么?

注意:问题不在FooType中。我试着用int代替它,但没有用。。。

谢谢!

如果前向声明类型的大小必须已知,则前向声明不起作用。由于要在FooClass中嵌入boost::scoped_ptr<T>的实例,因此必须知道该类型的大小。

您可以嵌入一个指针,但这可能会首先破坏scoped_ptr<T>的目的。然而,它会编译:

class FooClass
{
    boost::scoped_ptr<FooType> *foo;
};

对不完整类型(即已声明但未定义的类型)的处理有限制;你不能做的一件事就是定义那种类型的变量。这是因为在这种情况下,为了计算对象中成员变量的布局,必须知道大小。

您可以做的事情包括使用对类型的指针或引用(只要您不取消引用它),用该类型声明一个函数作为参数或返回值,以及声明该类型的静态或非成员变量。