枚举到unsigned int

时间:2012-04-13 18:22:07

标签: c++ casting enums

我有以下代码:

class mph {
public:
enum minute_periods {five, ten, fifteen, thirty}; 
   std::vector<minute_periods> factors;
  minute_periods fac;

void setUpFactors(void) { 
    factors.resize(4);
    factors[five] = 5;
    factors[ten] = 10;
    factors[fifteen] = 15;
    factors[thirty] = 30;
  }

我收到以下错误:

error: invalid conversion from ‘int’ to ‘mph::minute_periods’

我该如何解决?

6 个答案:

答案 0 :(得分:3)

int未被隐式强制转换为enum,您必须明确地执行此操作,这就是您收到错误的原因。我认为这段代码不会按你的意愿行事,但看起来你想要这样的东西。

    std::map<minute_periods, int> factors;

那样factors[five]会给你一个int,而不是像enum那样的向量。我猜测你的代码就是你想要的,因为值5,10,15和30超出了enum的范围(从0到3)。

答案 1 :(得分:2)

在C ++中,您可以隐式地从enum投射到int,但不是相反。您可以使用显式强制转换来解决此问题:

factors.resize(4);
factors[five] = minute_period(5);
factors[ten] = minute_period(10);
factors[fifteen] = minute_period(15);
factors[thirty] = minute_period(30);

希望这有帮助!

答案 2 :(得分:1)

您只能将枚举转换为整数,而不能将整数转换为枚举。由于向量是minute_periods的列表,因此您应该只为因子分配分钟周期。你可能想要

factors[five] = five;
factors[ten] = ten;
factors[fifteen] = fifteen;
factors[thirty] = thirty;

这将解决您的编译错误。

答案 3 :(得分:1)

您的代码会导致在两个位置生成错误:

  • 当您使用enum值作为vector
  • 的索引时
  • 当您使用enum值作为该向量中的值时

你的逻辑是有缺陷的。 vector始终由整数编制索引。一个疯狂的猜测是你想要map<minute_period, int>,但是第二个想法 - 这没有任何意义。

要将enum值用作整数,只需执行以下操作:

enum minute_periods 
{
    five = 5, 
    ten = 10, 
    fifteen = 15, 
    thirty = 30
}; 

这是将enum值用作整数的正确方法 - 而不是将标签转换为值的一些愚蠢的数据结构。

答案 4 :(得分:0)

如果你想这样做,你需要将你的向量声明为std::vector<unsigned int> factors;。如果您通过向量将枚举转换为不同的值,则向量的值类型应该是您要转换的类型。可以通过隐式转换将枚举作为索引来完成查找。

我还建议将count枚举值定义为枚举值列表中的最后一个条目。它可以取代硬编码的大小。

答案 5 :(得分:0)

您想使用map而不是vector。因为看起来你要存储的是从枚举到整数的映射 - 而不是minute_periods

的向量
class mph {
public:
enum minute_periods {five, ten, fifteen, thirty}; 
   std::map<minute_periods, int> factors;

void setUpFactors(void) { 
    factors[five] = 5;
    factors[ten] = 10;
    factors[fifteen] = 15;
    factors[thirty] = 30;
  }
};

此外,您可能只是简单地设置枚举值:

class mph {
    public:
    enum minute_periods {five = 5, ten = 10, fifteen = 15, thirty = 30}; 
};