我有一个大型项目库和一些我自己添加的文件。其中一个是头文件,其中包含我在整个项目中使用的一些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。 我不能创建一个小例子,并在这里发布将复制错误。我认为它必须是项目结构的问题。但我不知道在哪里看,如果有人可以指出我可以调查的潜在问题,那将会有所帮助。
答案 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::map
,you 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