我有几个>>> 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 ;
答案 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::Ok
或Response::Busy
。
(2)您可以更改名称以包含枚举名称:
enum Response
{
Response_Ok = 0,
Response_Busy = 1
};
(3)您可以将枚举本身包含在命名空间中:
namespace Status
{
enum Status
{
Ok = 0,
LoggedOut = 1
};
}