Another macro-based solution:
#define Foo class Foo
The statement Foo("hi");
expands to class Foo("hi");
, which is ill-formed; but Foo a("hi")
expands to class Foo a("hi")
, which is correct.
This has the advantage that it is both source- and binary-compatible with existing (correct) code. (This claim is not entirely correct – please see Johannes Schaub’s Comment and ensuing discussion below: “How can you know that it is source compatible with existing code? His friend includes his header and has void f() { int Foo = 0; } which previously compiled fine and now miscompiles! Also, every line that defines a member function of class Foo fails: void class Foo::bar() {}”)