In C++, a class and a typedef cannot both use the same name to refer to a different type within the same scope (unless the typedef is a synonym for the class name).
In C, a typedef name and a struct tag name declared in the
same scope can have the same name because they have different
name spaces. For example:
void main () { typedef double db; struct db; // error in C++, valid in ISO/ANSI C typedef struct st st; // valid ISO/ANSI C and C++ }