使用两个枚举的重载解决方案

发布于 2024-07-25 22:35:43 字数 415 浏览 3 评论 0原文

我们有一些代码,大致如下所示:

// Two enums that differ entirely.
enum A { a1, a2 };
enum B { b1, b2 };

// Functions to convert in some meaningful way between them
A convert(B);
B convert(A);

现在,我们的编译器完全按照我们的预期执行。 convert(a1) 将调用 B Convert(A),依此类推。 然而,当我们使用 Lint 查看代码时,它会抱怨错误 31。我们怀疑这是因为枚举的底层整型类型是相同的,因此 Lint 可能会这样对待它们。

我的问题是:这是代码标准,还是这是编译器功能的意外使用?

We have some code that looks roughly like this:

// Two enums that differ entirely.
enum A { a1, a2 };
enum B { b1, b2 };

// Functions to convert in some meaningful way between them
A convert(B);
B convert(A);

Now, our compiler goes and does exactly what we expect it to. convert(a1) will call B convert(A), and so on. However, when we use Lint to look at our code, it complains with error 31. We suspect that this is because the underlying integral type of the enums are the same, and thus Lint might be treating them as such.

The question I have is: is the code standard, or is this an accidental use of a compiler feature?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

我不吻晚风 2024-08-01 22:35:43

这段代码是标准且正确的。 该错误位于 LINT 中

This code is standard and correct. The bug is in LINT

闻呓 2024-08-01 22:35:43

我不确定以这种方式返回枚举而不是类型定义的枚举是否会被视为标准,但我可能是错的。 另外,作为一名 C 程序员,我会避免对两个函数使用相同的名称(因为重载是不可能的),但我倾向于在 C++ 中避免使用相同的名称,因为很容易出错。

如果我编写这段代码,我会得到类似的结果:

typedef enum { a1, a2 } A;
typedef enum { b1, b2 } B;
A convertBToA(B BInstance);
B convertAToB(A AInstance);

但是,我希望 Lint 能够满意(在 C++ 中):

typedef enum { a1, a2 } A;
typedef enum { b1, b2 } B;
A convert(B BInstance);
B convert(A AInstance);

I'm not sure that it would be considered standard to return an enum rather than a typedef'd enum in this way, but I could be wrong. Also, as a C programmer, I would avoid using the same name for the two functions (as overloading is impossible), but I tend to avoid it in C++ anyway as it is easy to make a mistake.

If I were writing this code, I would have something like:

typedef enum { a1, a2 } A;
typedef enum { b1, b2 } B;
A convertBToA(B BInstance);
B convertAToB(A AInstance);

However, I would expect Lint to be happy (in C++) with:

typedef enum { a1, a2 } A;
typedef enum { b1, b2 } B;
A convert(B BInstance);
B convert(A AInstance);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文