我正在创建一个代码,根据用户输入显示一年中的几个月,但是我在" mes = n" 行收到错误。这是以下代码:
#include <iostream>
using namespace std;
int main(){
int n = 0;
enum meses {Janeiro = 1, Fevereiro = 2, Marco = 3, Abril = 4, Maio = 5, Junho= 6,
Julho = 7, Agosto = 8, Setembro = 9, Outubro = 10,Novembro = 11, Dezembro = 12}mes;
cin>>n;
mes = n; // That's where I get an error!
switch(mes)
{
case Janeiro: cout<<"janeiro"; break;
case Fevereiro: cout<<"fevereiro"; break;
case Marco: cout<<"marco"; break;
case Abril: cout<<"abril"; break;
case Maio: cout<<"maio"; break;
case Junho: cout<<"junho"; break;
case Julho: cout<<"julho"; break;
case Agosto: cout<<"agosto"; break;
case Setembro: cout<<"setembro"; break;
case Outubro: cout<<"outubro"; break;
case Novembro: cout<<"novembro"; break;
case Dezembro: cout<<"dezembro"; break;
default: cout<<"invalido"; break;
}
return 0;
}
编译错误是:&#34;无效转换从int到main():: meses&#34;。
答案 0 :(得分:3)
在标准C ++中,没有隐式转换到 enum
类型。所以你不能简单地写mes = n;
。要进行此转换,您需要明确地进行此转换,例如:
mes = static_cast<meses>(n);
但是, 是从未作用域的enum
s 到 int
的隐式转换。 (从技术上讲,这是整数提升)。所以你不需要演员:
int x = Janeiro;
因此,您问题的另一个解决方案是使用int
来存储输入的值。事实上,您已经n
履行了这个角色:
switch(n)
{
case Janeiro: .....
如上所述,case Janeiro
不需要强制转换,因为未编组的枚举器会提升为整数类型。
从技术上讲,如果枚举数大于std::underlying_type<meses>::type
,则应使用int
代替INT_MAX
。
如果你想要两个转换方向都需要一个强制转换(enum到int,int到enum),那么你必须使用范围的枚举,即enum class meses
。< / p>
答案 1 :(得分:1)
有几个问题,我给你3个可能的修复和解释如下:
#include <iostream>
using namespace std;
int main(){
int n = 0;
//Using a local variable only:
//*
enum meses {Janeiro = 1, Fevereiro = 2, Marco = 3, Abril = 4, Maio = 5, Junho= 6,
Julho = 7, Agosto = 8, Setembro = 9, Outubro = 10,Novembro = 11, Dezembro = 12}mes;
cin>>n;
mes = (meses)n; // Cast to convert int into a meses_type
//*/
//Or declaring the enum:
/*
enum meses {Janeiro = 1, Fevereiro = 2, Marco = 3, Abril = 4, Maio = 5, Junho= 6,
Julho = 7, Agosto = 8, Setembro = 9, Outubro = 10,Novembro = 11, Dezembro = 12};
cin>>n;
meses mes = (meses)n; // Cast to convert int into a meses_type
//*/
// Using typedef
/*
typedef enum meses {Janeiro = 1, Fevereiro = 2, Marco = 3, Abril = 4, Maio = 5, Junho= 6,
Julho = 7, Agosto = 8, Setembro = 9, Outubro = 10,Novembro = 11, Dezembro = 12}meses_type;
cin>>n;
meses_type mes = (meses_type)n; // Cast to convert int into a meses_type
//*/
switch(mes)
{
case Janeiro: cout<<"janeiro"; break;
case Fevereiro: cout<<"fevereiro"; break;
case Marco: cout<<"marco"; break;
case Abril: cout<<"abril"; break;
case Maio: cout<<"maio"; break;
case Junho: cout<<"junho"; break;
case Julho: cout<<"julho"; break;
case Agosto: cout<<"agosto"; break;
case Setembro: cout<<"setembro"; break;
case Outubro: cout<<"outubro"; break;
case Novembro: cout<<"novembro"; break;
case Dezembro: cout<<"dezembro"; break;
default: cout<<"invalido"; break;
}
return 0;
}
第一个解决方案就是我的想法。
1)创建一个名为enum meses
的{{1}}类型的变量。对于该变量,枚举类型只能在此处使用一次。
2)创建枚举,然后创建变量。这样,您可以创建该枚举类型的多个实例。
3)使用typedef来缩短名称(尽管不是非常有用,对于struct而言比enum更有趣)。
最后,要将int放入枚举类型的变量中,需要将into转换为枚举类型。 C ++认为这些东西是完全不同的对象(即使枚举最终只是一堆整数)。
答案 2 :(得分:0)
您的语法错误。这应该是这样的:
enum meses {
Janeiro = 1, Fevereiro = 2, Marco = 3, Abril = 4, Maio = 5, Junho= 6,
Julho = 7, Agosto = 8, Setembro = 9, Outubro = 10,Novembro = 11, Dezembro = 12
};
cin>>n;
meses mes = n;
switch(mes)
...
或者对于作用域枚举(c ++ 11):
enum class meses {
Janeiro = 1, Fevereiro = 2, Marco = 3, Abril = 4, Maio = 5, Junho= 6,
Julho = 7, Agosto = 8, Setembro = 9, Outubro = 10,Novembro = 11, Dezembro = 12
};
...
您可以使用meses::janiero
等...
答案 3 :(得分:0)
您可以使用switch(n)
:
int main() {
int n = 0;
enum meses {Janeiro = 1, Fevereiro = 2, Marco = 3, Abril = 4, Maio = 5,
Junho= 6, Julho = 7, Agosto = 8, Setembro = 9, Outubro = 10,
Novembro = 11, Dezembro = 12};
cin >> n;
switch(n)
{
case Janeiro: cout<<"janeiro"; break;
case Fevereiro: cout<<"fevereiro"; break;
case Marco: cout<<"marco"; break;
case Abril: cout<<"abril"; break;
case Maio: cout<<"maio"; break;
case Junho: cout<<"junho"; break;
case Julho: cout<<"julho"; break;
case Agosto: cout<<"agosto"; break;
case Setembro: cout<<"setembro"; break;
case Outubro: cout<<"outubro"; break;
case Novembro: cout<<"novembro"; break;
case Dezembro: cout<<"dezembro"; break;
default: cout<<"invalido"; break;
}
return 0;
}
或使用static_cast<meses>(n)
:
int main() {
int n = 0;
enum meses {Janeiro = 1, Fevereiro = 2, Marco = 3, Abril = 4, Maio = 5,
Junho= 6, Julho = 7, Agosto = 8, Setembro = 9, Outubro = 10,
Novembro = 11, Dezembro = 12}mes;
cin >> n;
mes = static_cast<meses>(n);
switch(mes)
{
case Janeiro: cout<<"janeiro"; break;
case Fevereiro: cout<<"fevereiro"; break;
case Marco: cout<<"marco"; break;
case Abril: cout<<"abril"; break;
case Maio: cout<<"maio"; break;
case Junho: cout<<"junho"; break;
case Julho: cout<<"julho"; break;
case Agosto: cout<<"agosto"; break;
case Setembro: cout<<"setembro"; break;
case Outubro: cout<<"outubro"; break;
case Novembro: cout<<"novembro"; break;
case Dezembro: cout<<"dezembro"; break;
default: cout<<"invalido"; break;
}
return 0;
}