我正在经历一些我不太了解的奇怪事情。
我收到的错误如下:
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;
答案 0 :(得分:4)
如果您确定它不是循环包含,那么请记住,您可以始终回到那种经常被忽视的使用适当的编译器开关来转储预处理源的技术,即在编译阶段之前将其停止。通过搜索输出,您将找到编译器抱怨的原因,因为您现在正在查看编译器看到的内容。
选项是MSVC中的/ E和带有gcc的-E。
答案 1 :(得分:2)
是否也CP_String.h
包含CP_STLArrayDefines.h
,以便两个文件都试图互相包含?如果在头文件中包含防护,这可能会导致您描述的错误。
答案 2 :(得分:1)
CP_String.h是否得到妥善保护?我的意思是,标题多包含警卫,当然。
可能是,CP_String.h之前包含的标题之一与警卫中使用的符号相同(当你复制粘贴时,包括从一个标题到另一个标题的警卫)。
答案 3 :(得分:0)
我没有足够的信息给你一个答案,但我会猜测你所看到的错误的可能原因。是CP_String
在命名空间内声明了吗?如果是这样的话是什么?我看到宏调用:CPLAT_Begin_Namespace_CPLAT
,我假设它像using namespace CPLAT;
那样,可能是一些标准设置。也许,由于您在评论中提到的重组,CP_String
不再位于CPLAT
命名空间中,因此编译器无法找到它。