2

よくわからない奇妙なことを経験しています。

次のようなエラーが発生します:

framework/CP_STLArrayDefines.h(37): error: identifier "CP_String" is undefined
    typedef std::vector<CP_String, std::allocator<CP_String> >                      CP_Strings_Array;
                        ^
framework/CP_STLArrayDefines.h(37): error: identifier "CP_String" is undefined
    typedef std::vector<CP_String, std::allocator<CP_String> >

しかし、CP_STLArrayDefinesを調べてみると、明らかに次のことを行っています。

#include "CP_String.h"

CP_String.hと.cppを見ると、問題ないようです。

それらは両方とも同じディレクトリにあります。

何を探すべきですか?

CP_STLArrayDefine.hは次のとおりです。

#ifndef CP_STLArrayDefines_H
#define CP_STLArrayDefines_H

#ifndef TARGET_OS_LINUX
#   pragma once
#endif

// CPLAT_Framework
#include "CP_Point.h"
#include "CP_String.h"
#include "CP_Types.h"

// Standard Library
#include <vector>

CPLAT_Begin_Namespace_CPLAT

    // typedefs
#if ! TARGET_OS_LINUX
    typedef std::vector`<CP_String, std::allocator<`CP_String>` >`                      CP_Strings_Array;
    typedef std::vector`<CP_String, std::allocator<`CP_String>` >`::iterator            CP_Strings_Iterator;
    typedef std::vector`<CP_String, std::allocator<`CP_String>` >`::reverse_iterator    CP_Strings_ReverseIterator;
4

4 に答える 4

4

循環インクルードではないと確信している場合は、適切なコンパイラスイッチを使用して前処理されたソースをダンプする、つまりコンパイルフェーズを実行する前に停止させるという見過ごされがちな手法にいつでもフォールバックできることを忘れないでください。その出力を検索すると、コンパイラーが認識しているものを確認しているときに、コンパイラーが不平を言っている理由がわかります。

オプションは、MSVCでは/ E、gccでは-Eです。

于 2009-08-17T17:23:38.920 に答える
2

両方のファイルがお互いを含めようとするように、おそらくもCP_String.h含まれていますか?CP_STLArrayDefines.hヘッダーファイルにインクルードガードを使用すると、説明したようなエラーが発生する可能性があります。

于 2009-08-17T17:06:32.667 に答える
1

CP_String.hは適切に保護されていますか?もちろん、ヘッダーのマルチインクルージョンガードです。

CP_String.hの前に含まれているヘッダーの1つに、ガードで使用されているのと同じ記号が含まれている可能性があります(これは、あるヘッダーから別のヘッダーにインクルードガードをコピーして貼り付ける場合に発生します)。

于 2009-08-17T17:06:35.023 に答える
0

私はあなたに答えを与えるのに十分な情報を持っていませんが、あなたが見ているエラーの考えられる原因について大胆に推測します。CP_String名前空間内で宣言されていますか?もしそうなら、それは何ですか?マクロの呼び出しが表示されます。これは、標準的な設定のCPLAT_Begin_Namespace_CPLATようなものであると思います。using namespace CPLAT;おそらく、コメントで言及した再編成のためCP_Stringに、名前空間に存在しなくなったCPLATため、コンパイラーはそれを見つけることができません。

于 2009-08-22T09:51:28.183 に答える