3

そのため、あるクラスから別のクラスに関数を共有するというこの問題と、問題を解決していない限り、これまでに見つけたすべての解決策に悩まされてきました。1 つのインスタンスがここにあります (他にもあることを保証します)、[http://software.intel.com/en-us/articles/cdiag436]

Bar.h

#ifndef __Bar_h_
#define __Bar_h_
#include "BaseApplication.h"  
#include <Foo.h>  

class Foo;  
Foo *foo;  

class Bar : BaseApplication
{
   public:
Bar(void);
~Bar(void);
   protected:
virtual void barCreate(void);
};
#endif

Bar.cpp

#include "Bar.h"
#include <Foo.h>
Bar::Bar(void){}
Bar::~Bar(void){}
void Bar::barCreate(void)
{
     if(foo->foobar()==true) //error: pointer to incomplete class type is not allowed
        {//stuff}
}

フー。

#ifndef __foo_h_
#define __foo_h_
class Foo
{
public:
Foo(void);
~Foo(void);
bool foobar(void);
};
#endif

Foo.cpp

#include "Foo.h"
Foo::Foo(void){}
bool Foo::foobar(void){ return true; }

どこが間違っているのかについての指針や説明を得ることができれば、それは素晴らしいことです。

4

1 に答える 1

5

エラーを読み違えています。不完全な型へのポインターを持つことについて不平を言っているのではなく、それを逆参照することについて不平を言っています。

if(foo->foobar()==true)

この時点で の型fooは不完全な型であるため、コンパイラはfoobarメンバー関数 (またはメンバー ファンクター) を持つかどうかを確認できません。

基本的に、不完全な型の場合、ポインターまたは参照を宣言および定義し、インターフェイス (型を取得または返す関数) を宣言できます。ただし、それ以外は、そのタイプのオブジェクトを作成したり、ポインター/参照をコピーする以外にポインター/参照を使用したりすることはできません。

あなたが間違っていることに関しては、実際のファイルをより詳細に調べる必要があります。を定義するヘッダーをインクルードしていないかFoo、複数のFoo型 (異なる名前空間? 1 つは型を定義し、もう 1 つは前方宣言を持っています) を持っているか、インクルード ガードが間違っていて、ヘッダーを含めたとしてもガードはの内容を破棄しますヘッダ。定義するヘッダーをインクルードした後、型の前方宣言Fooを提供する必要はありません (提供すべきではありません) 。前方宣言を削除してもコンパイルに失敗する場合は、その理由を突き止めて修正してください。Foo

于 2012-10-12T13:59:09.913 に答える