很抱歉,如果之前有人询问过,或者我的代码中有错误,但我刚刚遇到了一个错误,我在分配一个错误的变量,并且在这个例子中很简单:
#include <string>
enum Enum {
A, B, C
};
int main() {
std::string s = "A";
if (s == "A")
s = A;
else if (s == "B")
s = B;
else if (s == "C")
s = C;
printf ("%s\n", s.c_str());
return 0;
}
请注意,在if / else if语句中,我分配给变量s(实际示例是将&#34; mode&#34;转换为&#34; mode _&#34;其中一个是字符串,一个是枚举,我在一个案例中留下了下划线。
我的问题是,为什么编译器没有抱怨?即使使用-Wall和-W,它也会默默成功。
我觉得我错过了某些东西,或者我的编译器出了什么问题?标准中有什么内容吗?
答案 0 :(得分:4)
标准库包含原型
basic_string& operator=(charT c);
表示您可以将单个字符分配给字符串:
s = 'A';
但是单个字符只是一个小整数,不是吗?
您可以使用C ++ 11样式的范围枚举器来避免此问题。以下将产生预期的编译器错误:
#include <string>
enum class Enum {
A, B, C
};
int main() {
std::string s = "A";
if (s == "A")
s = Enum::A;
else if (s == "B")
s = Enum::B;
else if (s == "C")
s = Enum::C;
printf ("%s\n", s.c_str());
return 0;
}
答案 1 :(得分:2)
您没有将字符串与枚举进行比较,而是在比较两个字符串。
但是,您要为字符串分配枚举值。这里枚举值(隐式为整数)由编译器隐式转换为char,然后可以将其赋值给std :: string。