这是发生冲突的一小段代码。有什么方法可以正确解决这个问题吗?
#define DEBUG 0
enum class TypeEnum : int
{
DEBUG = 0,
INFO = 1
};
Run Code Online (Sandbox Code Playgroud) I've been using overloaded operators as demonstrated in the second answer from here: How to use C++11 enum class for flags ... example:
#define ENUMFLAGOPS(EnumName)\
[[nodiscard]] __forceinline EnumName operator|(EnumName lhs, EnumName rhs)\
{\
return static_cast<EnumName>(\
static_cast<std::underlying_type<EnumName>::type>(lhs) |\
static_cast<std::underlying_type<EnumName>::type>(rhs)\
);\
}...(other operator overloads)
enum class MyFlags : UINT //duplicated in JS
{
None = 0,
FlagA = 1,
FlagB = 2,
FlagC = 4,
};
ENUMFLAGOPS(MyFlags)
Run Code Online (Sandbox Code Playgroud)
...
MyFlags Flags = MyFlags::FlagA | MyFlags::FlagB;
Run Code Online (Sandbox Code Playgroud)
And I've grown concerned that this may be …
我有这样的课程:
struct InsertResult{
enum class Status{
INSERTED ,
UPDATED_IN_PLACE ,
REPLACED ,
SKIP_INSERTED ,
ERROR_NO_MEMORY ,
ERROR_INVALID ,
ERROR
};
bool ok;
Status status;
// more members here...
// spill the enum:
constexpr static auto INSERTED = Status::INSERTED ;
constexpr static auto UPDATED_IN_PLACE = Status::UPDATED_IN_PLACE ;
constexpr static auto REPLACED = Status::REPLACED ;
constexpr static auto SKIP_INSERTED = Status::SKIP_INSERTED ;
constexpr static auto ERROR_NO_MEMORY = Status::ERROR_NO_MEMORY ;
constexpr static auto ERROR_INVALID = Status::ERROR_INVALID ;
constexpr static auto ERROR = Status::ERROR …Run Code Online (Sandbox Code Playgroud) 我有一段代码返回给定数字的某些位的值(我也使用 static_cast 将枚举类计算为一个数字)。
template<typename Type>
bool get_bits(Type input, uint8_t offset, uint8_t n, Type* destination)
{
if (offset + n> sizeof(Type) * 8)
return false;
Type bitmask = 0;
for (int i = 0; i < n; ++i)
bitmask |= (1 << i);
*destination = static_cast<Type>(input >> offset & bitmask);
return true;
}
Run Code Online (Sandbox Code Playgroud)
该函数试图返回的值n的位input由开始offset。它适用于整数类型,但是当我尝试将它与枚举类一起使用时,编译失败。我尝试使用std::underlying_type然后它适用于枚举类但不适用于整数类型:|。我怎样才能将它用于他们两个?我的意思是,如果类型是枚举类,我想将输入转换为它的underlying_type,执行一些按位运算,然后将结果(使用static_cast)存储到目标。但是对于没有underlying_type 的整数类型,不应该进行这些转换。
我可能遗漏了一些东西,但我正在使用一个使用大量
typedef enum foo
{
....
} foo;
Run Code Online (Sandbox Code Playgroud)
这与枚举类相同但不是强类型的吗?
即使我正在使用Bukkit,这也是一个Java问题;
我不知道,为什么Java说构造函数是未定义的,因为它是定义的
import org.bukkit.entity.EntityType;
import net.minecraft.server.v1_10_R1.EntityCow;
import net.minecraft.server.v1_10_R1.EntityInsentient;
public enum Pets
{
COW("Cow", 92, EntityType.COW, EntityCow.class, Pets.class);
private String name;
private int id;
private EntityType et;
private Class<? extends EntityInsentient> nmsClass;
private Class<? extends EntityInsentient> customClass;
Pets(String name, int id, EntityType et, Class<? extends EntityInsentient> nmsClass, Class<? extends EntityInsentient> customClass)
{
this.name = name;
this.id = id;
this.et = et;
this.nmsClass = nmsClass;
this.customClass = customClass;
}
public String getName()
{
return name;
}
public int getID()
{
return id; …Run Code Online (Sandbox Code Playgroud) 我有一个enum classC++ 11:
enum class eDays{ SUNDAY, MONDAY, /*...*/ };
Run Code Online (Sandbox Code Playgroud)
在enum class这些值的命名空间,以便它有套使用,如:
eDays::SUNDAY
Run Code Online (Sandbox Code Playgroud)
我想设置一个名称空间块,所以我不需要每次都指定名称空间:
namespace eDays {
vector<eDays> vec = { MONDAY, SUNDAY, /*...*/ };
}
Run Code Online (Sandbox Code Playgroud)
代替:
vector<eDays> vec = { eDays::MONDAY, eDays::SUNDAY, /*...*/ };
Run Code Online (Sandbox Code Playgroud)
我错过了什么?
我想老式的改变enum来enum class : int 由于其自身范围。
但是编译器抱怨在整数算术中使用这些值。但是为什么 - 因为枚举被显式输入为 int?
例子:
enum class MsgType : int {
Output = 1,
Input = 2,
Debug = 3
};
enum class MsgSender : int {
A = 1,
B = 2,
C = 3
};
// later in code
int id = (MsgType::Input << 16) + (MsgSender::A);
Run Code Online (Sandbox Code Playgroud)
产生
错误 C2678:二进制“<<”:未找到采用“MyClass::MsgType”类型的左侧操作数的运算符(或没有可接受的转换)
这对我来说似乎有些不合逻辑。
编辑:
我完全意识到投射它们的可能性。但是如果我不希望它们可以转换,为什么我要将类型指定为int. 特别是如果语法暗示某种“继承自int”
尝试打印枚举类对象时出错。我在尝试打印时遇到错误。我在哪里做错了?
#include <iostream>
using namespace std;
int main()
{
enum weekdays{sunday,monday,tuesday};
cout<<monday<<endl; // getting value as 1 as i expected.
enum class Weekday{sunday,monday,tuesday};
enum class Holiday{sunday,saturday};
Weekday wday=Weekday::monday;
cout<<Weekday::monday<<endl; // getting error
cout<<wday<<endl; //getting error
return 0;
}
Run Code Online (Sandbox Code Playgroud) 当在varargs上下文中使用作用域枚举时,它被定义为作为其基础类型传递,如" 我可以使用枚举类值作为varargs函数的参数吗? "中所解释的那样.据我所知,这是唯一的情况,其中一个范围的枚举将被隐式转换,就像一个无范围的枚举.
考虑这个程序:
enum Foo : char { F };
enum class Bar : char { B };
#include <cstdio>
int main()
{
return !std::printf("%c\n", Foo::F)
+ !std::printf("%c\n", Bar::B);
}
Run Code Online (Sandbox Code Playgroud)
编译器(g++版本6.3.0)对a的第一个打印很满意Foo,但是当我传递时,抱怨Bar:
0.cpp: In function ‘int main()’:
0.cpp:10:34: warning: format ‘%c’ expects argument of type ‘int’, but argument 2 has type ‘Bar’ [-Wformat=]
+ !printf("%c\n", Bar::B);
^
Run Code Online (Sandbox Code Playgroud)
g++版本4.8.2没有抱怨这个,但g++6.3.0确实(这就是为什么它现在关注我).当存在实质性不匹配时,两个版本都抱怨第一次打印,例如使用%f或%s,或者如果我Foo改为使用long底层类型; 这就是我启用的原因-Wformat.
我知道警告不是标准一致性问题,我知道如何更改我的代码以解决这些问题(例如,在如何 …
我在测试中遇到了这个问题.
我知道我可以这样做:
enum class Color { red, green = 1, blue };
Color c = Color::blue;
if( c == Color::blue )
cout << "blue\n";
Run Code Online (Sandbox Code Playgroud)
但是,当我更换cout << "blue\n";使用cout << Color::green,它甚至不进行编译.为什么不编译?
enum-class ×11
c++ ×10
enums ×4
bukkit ×1
c++11 ×1
c++17 ×1
c++20 ×1
dry ×1
gcc-warning ×1
java ×1
namespaces ×1
sfinae ×1
static-cast ×1
templates ×1
typedef ×1