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::map
class,其次,你只使用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
我有一个很大的项目库和一些我自己添加的文件。其中之一是 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::map
class,其次,你只使用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