多个枚举中的相同名称

时间:2018-04-19 12:50:27

标签: c++

我有几个>>> timeit.timeit('pow(gmpy2.mpz(987654321),1000,100003)', number=100000, setup='import gmpy2') 0.057212181510976734 >>> timeit.timeit('gmpy2.powmod(987654321,1000,100003)', number=100000, setup='import gmpy2') 0.04513445007546579 >>> timeit.timeit('pow(987654321,1000,100003)', number=100000, setup='import gmpy2') 0.15511784474188062 具有相同的字段名称:

enum

这给出了错误:

  

错误:重新声明'确定'

如何解决这个问题?

UPD

尝试使用枚举类:

enum Response
{
  Ok = 0, 
  Busy = 1
}

enum Status
{
  Ok = 0, 
  LoggedOut = 1
}

收到错误:

enum class Response
{
  Ok = 0, 
  Busy = 1
}
Status s1 = Status::Ok ;

3 个答案:

答案 0 :(得分:8)

我会转而使用enum class

enum class Response
{
  Ok = 0, 
  Busy = 1
};

enum class Status
{
  Ok = 0, 
  LoggedOut = 1
};

然后您可以引用enum值而不含歧义

Status s = Status::Ok;

答案 1 :(得分:2)

我使用pre-C ++ 11的另一个解决方案:

struct Responses
{
  enum type {
    Ok = 0,
    Busy = 1
  };
};

typedef Responses::type Response;

struct States
{
  enum type {
    Ok = 0, 
    LoggedOut = 1
  };
};

typedef States::type Status;

然后将枚举称为:

Response r1 = Responses::Ok;
Response r1 = Responses::Busy;
Status s1 = States::Ok;
Status s2 = States::LoggedOut;

答案 2 :(得分:0)

问题出现了,因为C ++中的enum没有定义命名空间,而是一个可以隐式转换为int的常量。因此,您的代码类似于编写:

int Ok = 0;
int Busy = 1;

int Ok = 0;
int LoggedOut = 1;

当然,这会产生冲突。您可以采取三种可能的方法来解决这个问题,其中第一种方法是最理想的,但如果您出于某种原因无法使用它们,则其他方法可能是替代方案:

(1)如果您可以使用C ++ 11中的功能 - 您应该可以使用这些功能 - 您可以将enum替换为较新的enum class。它们都定义了一个单独的命名空间并且是强类型的,阻止您将不同的枚举混合在一起(有关详细信息,请参阅this question)。 e.g。

enum class Response
{
    Ok = 0, 
    Busy = 1
};

enum class Status
{
    Ok = 0, 
    LoggedOut = 1
};

您现在需要以范围的方式引用此值,例如Status::OkResponse::Busy

(2)您可以更改名称以包含枚举名称:

enum Response
{
    Response_Ok = 0, 
    Response_Busy = 1
};

(3)您可以将枚举本身包含在命名空间中:

 namespace Status
 {
     enum Status
     {
         Ok = 0,
         LoggedOut = 1
     };
 }