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

时间:2017-03-15 03:42:05

标签: c++ header-files

我有一个大型项目库和一些我自己添加的文件。其中一个是头文件,其中包含我在整个项目中使用的一些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" },
};
}

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

#ifndef THEOTHERHEADER_H
#define THEOTHERHEADER_H

#include "MyManyEnums.h"

#endif

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

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

在我的枚举头文件中。我很困惑,为什么这突然间会中断。我正在使用qtcreator和gcc。 我不能创建一个小例子,并在这里发布将复制错误。我认为它必须是项目结构的问题。但我不知道在哪里看,如果有人可以指出我可以调查的潜在问题,那将会有所帮助。

2 个答案:

答案 0 :(得分:2)

#include MyManyEnums.h的其他文件可能预先包含其他标题,这些标题恰好定义(直接或间接通过其他包含)这些类型。

我是头文件的拥护者,包括任何必要的依赖项(在这种情况下,MyManyEnums.h将#include <type_traits>#include <map>)。另一个选项是标题的任何使用者都包含其先决条件。选择一个范例并坚持下去。

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

答案 1 :(得分:2)

问题是双重的;首先,您的标头文件不#include <map>来定义std::map类,其次,您只使用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