2011-11-14 19 views
3

私は2つのヘッダファイルA.h(純仮想関数を含む)とB.h.Cでのテンプレート継承エラー

ああ:

#ifndef __A_H__ 
#define __A_H__ 

#include "B.h" 
template <class T> 
class A 
{ 
    virtual B<T> f()=0; 
}; 

#endif 

Bhの:Test.cppのから4、

#ifndef __B_H__ 
#define __B_H__ 

#include "A.h" 
template <class T> 
class B : public A <T> 
{ 
    B<T> f(){} 
}; 

#endif 

が、私はそれが私のファイルでその
のようなエラーを与えるコンパイルBhのから含ま: 1:
Ah:10:エラー:ISO C++は型なしの 'B'の宣言を禁止します
Ah:10:er ROR:10:「B」は「仮想」フィールド
A.hとして宣言エラー:予想「;」「<」トークン

#include "B.h" 

int main() { 
return 0; 
} 

どのように私はこの問題を解決することができる前に? おかげ

+1

抽象基本クラスが派生クラスのインスタンスを返す仮想関数を宣言する必要がある理由を説明できますか?私はあなたのコードが最小限の例であることを知っていますが、なぜあなたがこれを必要とするのかわかりません。別の方法でアプローチしたいと思うようです。 –

+0

下のリンクと同じロジック –

+0

関連のない注: '__A_H__'のような二重のアンダースコアを持つ名前は、実装(つまり、コンパイラと標準ライブラリ)用に予約されています。したがって、別の条約を採択することをお勧めします。 – celtschk

答えて

7

唯一の方法は、前方宣言である:

#ifndef __A_H__ 
#define __A_H__ 

template<typename> class B; 

template <class T> 
class A 
{ 
    virtual B<T>* f()=0; 
}; 

#endif 

あなただけusing forward declare解決することができるcircular dependencyに問題があります。

+0

ありがとうございました。あなたは私の時間を節約する –