A 786
A 786

Reputation: 557

Can two enums not have a member of similar name?

I have a situation where I need two enums to hold one member of the same name. My code is in C++, Using IAR Embeddedj Workbench IDE. The code snippet is as follows:

enum Port_e : uint32_t
{
    PortA = 0,
    PortB,
    PortC,
    PortD,
    PortE,
    PortF,
    PortG,
    PortH,
    PortI,
    PortJ,
    PortK,
    NONE
};

enum Pin_e : uint32_t
{
    Pin0 = 0, Pin1, Pin2, Pin3, Pin4, Pin5, Pin6, Pin7,
    Pin8, Pin9, Pin10, Pin11, Pin12, Pin13, Pin14, Pin15,NONE
};

If you notice here both enums have the last member as NONE. This code does not compile. Gives Error as NONE is already defined.

Is there any way to make it build while keeping the name as it is? I also do not want to change the type to "enum class" as it will break the rest of my application code.

Upvotes: 1

Views: 114

Answers (2)

Swift - Friday Pie
Swift - Friday Pie

Reputation: 14589

You can use class enums or nest your enums in appropriate classes or namespaces.

#include <iostream>

enum class A :uint32_t { One, Two, Three };
enum class B :uint32_t { One, Two, Three };

int main()
{
    std::cout << int(A::One) << std::endl;
}

Identifiers of enumeration are names of integral constants belonging to namespace enum is declared in. Class enums changed this situation, but you cant cast from and to them implicitly. Any other approach eventually would cause ODR breakage if you would use simple enogh names. In your code it leads to ambiguity: is NONE equal to 13? Or to 16?

Upvotes: 0

Vittorio Romeo
Vittorio Romeo

Reputation: 93264

Is there any way to make it build while keeping name as it is?

Not without changes. If you wrap Port_e and Pin_e in a namespace or class you can resolve the name collision, but that would still alter the way the enums are used.

I also do not want to change the type to "enum class" as it will break the rest of my application code.

I strongly suggest you to do that anyway, and take the time to fix your application code. enum class was designed exactly to solve this problem.

Upvotes: 4

Related Questions