Hossein Hossein - 1 year ago 37
C++ Question

How to use enums in C++

Suppose we have an

like the following:

enum Days {Saturday, Sunday, Tuesday,Wednesday, Thursday, Friday};

I want to create an instance of this
and initialize it with a proper value, so I do:

Days day = Days.Saturday;

Now I want to check my variable or instance with an existing
value, so I do:

if (day == Days.Saturday)
std::cout<<"Ok its Saturday";

Which gives me a compilation error:

error: expected primary-expression before ‘.’ token

So to be clear, what is the difference between saying:

if (day == Days.Saturday) //Causes compilation error


if (day == Saturday)


What do these two actually refer to, in that one is OK and one causes a compilation error?

Answer Source

This code is wrong:

enum Days { Saturday,Sunday,Tuesday,Wednesday,Thursday,Friday};
Days day = Days.Saturday;
if(day == Days.Saturday)

Because days is not a scope, nor object. It is a type. And Types themselves don't have members. What you wrote is the equivalent to std::string.clear. std::string is a type, so you can't use . on it. You use . on an instance of a class.

Unfortunately, enums are magical and so the analogy stops there. Because with a class, you can do std::string::clear to get a pointer to the member function, but in C++03, Days::Sunday is invalid. (Which is sad). This is because C++ is (somewhat) backwards compatable with C, and C had no namespaces, so enumerations had to be in the global namespace. So the syntax is simply:

enum Days { Saturday,Sunday,Tuesday,Wednesday,Thursday,Friday};
Days day = Saturday;
if(day == Saturday)