C++ #include of file 使 std 类型未知

C++ #include of file makes std types unknown

我有一个很大的项目库和一些我自己添加的文件。其中之一是 header 文件,其中包含我在整个项目中使用的一些 enum。它看起来像这样:

#ifndef MYMANYENUMS
#define MYMANYENUMS

namespace my_ns {

enum class RecType { NONE, L1, L2 };
inline int operator+ ( RecType t )
    { return underlying_type<RecType >::type(t); }

static const map<RecType, string> RecTypeMap = {
    { RecType ::NONE, "NONE" },
    { RecType ::L1, "L1" },
    { RecType ::L2, "L2" },
};
}

我将此 header 包含在整个项目的许多其他 header 中,没有任何问题。现在我添加了一个新的 header 文件:

#ifndef THEOTHERHEADER_H
#define THEOTHERHEADER_H

#include "MyManyEnums.h"

#endif

除了上面显示的内容之外,这个文件完全是空的。我一编译就收到错误:

map does not name a type
underlying_type was not declared in this scope

在我的枚举 header 文件中。我很困惑为什么这一切突然中断。我正在使用 qtcreator 和 gcc。 我不能在这里创建一个小示例和 post 来复制错误。我认为这一定是项目结构的问题。但我不知道去哪里寻找和尝试什么,所以如果有人能指出我可以调查的潜在问题,那将会很有帮助。

#include MyManyEnums.h 所在的其他文件很可能预先包含其他 header 碰巧定义(直接或通过其他包含间接)这些类型。

我提倡 header 文件,包括任何必要的依赖项本身(在这种情况下,MyManyEnums.h 将 #include <type_traits>#include <map>)。另一个选项是 header 的任何消费者都包含其先决条件。选择一个范例并坚持下去。

编辑: 正如 Ken Y-N 所指出的,您需要指定 std:: 命名空间(首选)或添加(有限的)using 声明。

问题是双重的;首先,你的头文件没有#include <map>定义std::mapclass,其次,你只使用map,而不是std::mapyou should NOT do in headers ]正是因为这个原因。

也许在你的 C++ 文件中你有这样的东西:

#include <type_traits>
#include <map>
using namespace std;
#include "mymanyenums.h" // Or whatever it is called.

但另一个文件只使用:

#include "theotherheader.h"

无需前三行进行设置。

所以,总而言之,使用这个:

#ifndef MYMANYENUMS
#define MYMANYENUMS

#include <type_traits>
#include <map>

namespace my_ns {

enum class RecType { NONE, L1, L2 };
inline int operator+ ( RecType t )
    { return std::underlying_type<RecType >::type(t); }

static const std::map<RecType, string> RecTypeMap = {
    { RecType ::NONE, "NONE" },
    { RecType ::L1, "L1" },
    { RecType ::L2, "L2" },
};
}

#endif