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 之前包含的其中一个标头在保护中使用了相同的符号(当您将包含保护从一个标头复制粘贴到另一个标头时会发生这种情况)。

于 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 回答