1

ヘッダーにクラスがあります:

class Communicator {
public:
std::map<std::string,obj::obj_version<obj::tkt_metadata>*> local_objects;
}

コンパイルすると、コードの後半で Communicator を作成し、問題なく通常どおりマップを使用できます。

ただし、クラス宣言の後に置くとすぐに:

extern Communicator comm;

そして追加:

Communicator comm;

ヘッダーの実装ファイルに、「エラー: 'obj' はこのスコープで宣言されていませんでした」などobjのメッセージが表示されます。

ここで何が起こっているのですか? 正しくコンパイルするためにできることはありますか? ありがとう!

4

2 に答える 2

1

ああ、役立つコメントを介して問題を発見しました(削除されました)。

したがって、私のヘッダー ファイルの 1 つobject.h(含まれていませんCommunicatorが、動作するオブジェクトCommunicator) は、実際には次のようになります。

-- obj_version and tkt_metadata
-- #include "communicator.h"
-- more stuff

私の実装ファイルは次のようなものでした:

-- #include "communicator.h"
-- define the functions
-- Communicator comm;

ただし、コメントの誰かが C++ の「コンパイル ユニット」に言及しました。ヘッダーはそれ自体ではコンパイルされず、実装ファイルのみがコンパイルされ、ヘッダーは実装ファイルごとに配置されるだけです。

したがって、Communicator(object.h で) 表示する必要のあるオブジェクトの後に my が含まれていましたが、実装ファイルには communicator.h のみが含まれており、object.h (これには communicator.h が含まれています) は含まれていませんでした。コンパイル ユニットは、名前空間 obj 内のオブジェクトが定義されていない状態で Communicator をコンパイルしようとしました。

したがって、答えは communicator.cc に入れることです。

-- #include "objects.h"
-- define the functions
-- Communicator comm;

これはかなり単純な問題です (そして、私が提供した情報だけではおそらく誰も答えられなかったでしょう) が、おかげで私の誤解が解けました!

于 2013-07-28T17:29:30.510 に答える
0

実際のコードでa を忘れましたか、;それともここに置くのを忘れましたか??

class Communicator {
public:
    std::map<std::string,obj::obj_version<obj::tkt_metadata>*> local_objects;
}; // <<<<< Note the ';' here!
于 2013-07-28T17:16:50.170 に答える