2009-08-23 16 views
5

は、私は本当にのように、テンプレートの種類Cのポインタを転送-宣言するために、このテンプレートポインタを前方-宣言

class A; 
template<class _T> class B; 
typedef B<A> C; 

のような、すなわち3つのステートメントを、必要がありますか私の前方宣言でクラスABを隠すことができるのでしょうか?

+0

litbの2行の方法は少し難解です。 – rlbond

+0

@rlbond、答えに移動して2行の怖いコードを削除しました –

答えて

8

まったく同じではありませんが、代わりにこれを行うことができます: "のためのヘッダファイルの後

class C; 
C* c = 0; 

とその後、実装ファイルには、あなただけのB < >のデフォルトコンストラクタを使用する必要がある場合は代わりのtypedefの継承を使用して

class C : public B<A> {}; 

動作するはずです:」と 『Bは、このようなC』は 『定義し、含まれています』。

+0

EDIT:実装ファイルに "A"と "B"を宣言する必要はありません。ヘッダーファイルを含める必要があります。 – Ropez

+0

私は気にしたことではなく、素晴らしい提案です。ありがとう! –

+0

本当に役に立ち、巧妙な解決策、ありがとう、@ロペス! – Steed

1

私は本当にあなたの質問を理解していないが、このようなコード:

template<class _T> class B; 

は違法です。 C++は、 のアンダースコアとコンパイラの&ライブラリ実装の大文字で始まる名前を予約しています。あなた自身のコードでそれらを使用することはできません。

+0

私にこの助けてくれてありがとう –

3

はい、必要です。 3行すべてが異なることに注意してください。最初のクラスはクラスを宣言します。 2番目はテンプレートを宣言し、3番目はtypedef-nameを宣言します。 typedef-nameを宣言する際には、 "class A"のような精巧な型指定子を使用して、名前をスコープに入れずにクラスに名前を付けることができますが、typedef宣言でテンプレート宣言を折りたたむことはできません。

私は3行について心配しません。それが必要なら、私はちょうどそれらを書くでしょう:)

+0

私はプライベートポインタのためだけに使っているので、基本的な詳細を明らかにする必要なく、必要なスペースを確保します。 –

+0

どういう意味ですか?あなたはどのようにそれを見て、それが今見えるようにしたいと思うか質問にコードを書いてください?私たちはもっと理解できると思う。 –