I am compiling with the C-Stadard 20 using this argument: "-std=gnu++2a". Thus I thought I am able to use the using
keyword as following:
void anyfunc(const foo::bar& value) {
switch (foo:bar(value)) {
using enum foo:bar;
case George:
// ...
case Mary:
// ...
default:
// ...
}
}
But my new gcc won't compile it because it does not know the 'using' keyword:
main.cpp:69:11: error: expected nested-name-specifier before ‘enum’
69 | using enum foo::var;
| ^~~~
The gcc version I use is:
arm-linux-g++.br_real (Buildroot 2022.02.5) 10.4.0
See here my full minimal example:
#include <stdio.h>
namespace foo {
enum class bar {
George = 0,
Mary,
Martin,
// ...
};
}
void anyfunc(const foo::bar value) {
// This is working
switch (foo::bar(value)) {
case foo::bar::George:
printf("George");
case foo::bar::Mary:
printf("Mary");
default:
printf("Default");
}
// This does not compile
// switch (foo::bar(value)) {
// using enum foo::bar;
// case George:
// printf("George");
// case Mary:
// printf("Mary");
// default:
// printf("Default");
// }
}
int main() {
anyfunc(foo::bar::Mary);
// ..
}
::
to separate the namespace from the enum class
value
into a foo::bar
.Example:
#include <iostream>
namespace foo {
enum class bar {
George, Mary
};
}
void anyfunc(const foo::bar value) { // prefer to take it by value instead
switch (value) { // no cast
using enum foo::bar; // note ::
case George:
std::cout << "George\n";
break;
case Mary:
std::cout << "Mary\n";
break;
default:
std::cout << "default\n";
}
}
int main() {
anyfunc(foo::bar::Mary);
}
Output:
Mary
Note: using enum
(P1099R5) was added in g++ 11 so you will probably not be able to use it with your arm-linux-g++.br_real (Buildroot 2022.02.5) 10.4.0
compiler.