如何转发声明提升智能ptr?

kra*_*lyk 5 c++ boost

此代码无法复制:

namespace boost
{
  template<class T> class scoped_ptr;
}

namespace FooNamespace
{

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

}
Run Code Online (Sandbox Code Playgroud)

g ++说:错误:字段'foo'的类型不完整

我认为没关系,因为我从实际的boost头文件中复制了scoped_ptr声明...我搞砸了什么?

注意:问题不在于error: field ‘foo’ has incomplete type.我试着替换它FooType无济于事......

谢谢!

Fré*_*idi 6

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

你可以嵌入一个指针,但这可能会破坏首先的目的scoped_ptr<T>.但是,它会编译:

class FooClass
{
    boost::scoped_ptr<FooType> *foo;
};
Run Code Online (Sandbox Code Playgroud)


Mik*_*our 6

对于不完整类型(即已声明但未定义的类型)可以执行的操作存在限制; 你不能做的一件事是定义那种类型的变量.这是因为必须知道大小,在这种情况下是为了计算对象中成员变量的布局.

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