Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C++ object name same as class name

Tags:

c++

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?

like image 373
my_question Avatar asked Nov 11 '12 16:11

my_question


2 Answers

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;
}

Explanation

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.

like image 158
Zeta Avatar answered Sep 24 '22 13:09

Zeta


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.

like image 30
Vaughn Cato Avatar answered Sep 23 '22 13:09

Vaughn Cato