I happen to write a code like this:
class a
{
public:
a() {}
};
int main()
{
a *a = new a; // line 10
a a; // line 11
return 0;
}
g++ errors out:
2.c: In function ‘int main()’:
2.c:10:16: error: expected type-specifier before ‘a’
2.c:10:16: error: cannot convert ‘int*’ to ‘a*’ in initialization
2.c:10:16: error: expected ‘,’ or ‘;’ before ‘a’
2.c:11:7: error: expected ‘;’ before ‘a’
I found that, if I change "a *a" to "a *b" at line 10, then g++ is happy, here is the good code:
class a
{
public:
a() {}
};
int main()
{
a *b = new a;
a a;
return 0;
}
I am confused, not sure why the original code does not compile and how the "fix" works.
Any idea?
See Vaughn's answer for details. However, you can fix this problem if you specify that you want to use the class and not the variable:
class a
{
public:
a() {}
};
int main()
{
a *a = new class a;
return 0;
}
or
int main()
{
class a a; // although the class word isn't needed here
return 0;
}
Back in the days of C structs were put in their own namespace. In C++ something similar happens, however, the class names are available outside of their namespace, as long as there is no local function or variable with the same name.
If you happen to use the same name for both a class/struct A
and a variable/function A
you have to use the struct
/class
keyword, because the compiler interprets all following occurrences of A
as the variable/function and not the struct/class.
As soon as the variable name you are declaring is seen, it becomes accessible.
So in this code:
a *a = new a;
1
At point 1, a
is referring to the variable a and not the class a.
When you do this instead:
a *b = new a;
a a;
it isn't a problem, since b
is a different name.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With