1. ホーム
  2. c++

[解決済み] エラーが発生しました。ヘッダが含まれているにもかかわらず、クラスが宣言されていない、他の場所でコードが正常にコンパイルされている

2022-03-14 01:33:14

質問

あるクラスが別のクラスに含まれているのですが、そのクラスが "error: 'ProblemClass' has not been declared という形のコンパイルエラーを出し続けています。ファイルはこのようにセットアップされています。

#ifndef PROBLEMCLASS_H
#define PROBLEMCLASS_H

#include <iostream>
#include <cmath>

class ProblemClass
{
  public:

    virtual void Init() = 0;
};

#endif

で、エラーが発生したクラスは次のようになります。

#ifndef ACLASS_H
#define ACLASS_H

#include "problemclass.h"

class AClass : public Base
{
  public:

    void DoSomething(ProblemClass* problem);

};

#endif

コンパイルエラーはvoid Dosomething()で発生します。

ここのコードだけでは解決しないことは承知しています。再現できるような最小限の例を作ることができませんでした。ですから、私の質問はより一般的なもので、どのようなことが原因でこのようなことが起こるのでしょうか?特に探すべきもの、またはそれを追跡するために従うべき質問事項がありますか?

このコードは、ほぼ同じバージョンのプロジェクトで問題なくコンパイルできます。

どんな漠然としたものでも構いませんので、ご助力をお願いします。コードブロック10.05とmingw4.4.1をwin7 64bitで使用しています。

解決方法は?

あなたが示しているコードは、あなたが問題にしているコンパイラーエラーを実際には発生させないと言っているようですね。ですから、私たちは推測するしかありません。以下、いくつかの可能性を挙げてみます。

  • を入れ忘れた可能性があります。 problemclass.h を使用しているファイルから ProblemClass .
  • のスペルを間違えている可能性があります。 ProblemClass ヘッダーファイルの中か、使用している場所のどちらかで、そのヘッダーを使用しています。これは、次のような大文字小文字の間違いの場合、発見するのが難しいことがあります。 Problemclass または problemClass ではなく ProblemClass .
  • インクルードガードをコピーペーストすればよかったのに #defines をあるヘッダファイルから別のヘッダファイルへ移動し、定義された名前を変更するのを忘れました。そうすると、その2つのインクルードされたヘッダーファイルのうち、最初のものだけが有効になります。
  • を配置することができました。 ProblemClass を名前空間 A を参照する必要があります。 ProblemClass として A::ProblemClass 名前空間の外から参照する場合は A .
  • テンプレートを使用していて、二相ルックアップがこのように動作することを期待していないかもしれません。 となります。 .
  • インクルードでファイル名のスペルを間違えている可能性があります。コンパイラは、そのスペルミスのファイルの古いバージョンも持っていれば、それについてエラーを報告しないでしょう。
  • を作成することができます。 ProblemClass をインクルードした後にのみ定義されるマクロです。 problemclass.h として表示されます。 ProblemClass は、マクロプリプロセッサによって他のものに置き換えられます。
  • を定義することができました。 ProblemClass 以外のヘッダーファイルで problemclass.h で、次に problemclass.h は、実際には他のものを定義しています。