2012-02-08 5 views
4

このコードはcopmileに失敗:スマートptrをブーストする方法を宣言するには?

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

namespace FooNamespace 
{ 

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

} 

グラムを++言う:エラー:フィールド「fooが」不完全な型私は、実際のブーストヘッダファイルからオーバーscoped_ptrを宣言をコピーしたので、それは大丈夫だろうと思った

を持っています...どうしたの?

注:問題はFooTypeにありません。私はintで代用しようとしました...

ありがとう!

答えて

6

前方宣言型のサイズを知っていなければならない場合、前方宣言は機能しません。 boost::scoped_ptr<T>のインスタンスをFooClassに埋め込むので、そのタイプのサイズを知っている必要があります。

代わりにポインタを埋め込むこともできますが、最初はscoped_ptr<T>の目的を破るでしょう。しかし、それはコンパイルします:

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

ああ、私は参照してください。 私は 'auto_ptr'を使用しなければなりません。私は自分の.hのユーザにboostまたはsupportを含める必要がありません。C++ 11(まだ)...: - / – kralyk

6

あなたが不完全な型(つまり、宣言したが、定義されていないされていますタイプ)で何ができるかには制限があります。あなたができないことの1つは、そのタイプの変数を定義することです。この場合、オブジェクト内のメンバー変数のレイアウトを計算するために、サイズを知っておく必要があるからです。

あなたが行うことができることは、ポインタを参照すること(タイプを参照しない限り)、型を引数または戻り値として持つ関数を宣言すること、静的または非メンバーを宣言すること型の変数。

0

FooClassのデストラクタを定義するときに、あなたのタイプFooTypeが完了していなければならないboost::scoped_ptrの場合:

//header file hpp 

class FooType; 

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

//source file cpp 

#inlcude "FooClass.hpp" 
#inlcude "FooType.hpp" 

FooClass::FooClass() 
{} 

FooClass::~FooClass() 
{} 
関連する問題