Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Illegal Member initialization

I am using this pretty simple class without using any inheritance.

class A
{
  int a;
  int b;

public:
 A(int x, int y) { a = x; b = y;}
 A() :A(0,0){};
 ~A(){};
} ;

int main ()
{
  A a1, a2(5, 7) ;
}

I get this error.

error C2614: 'A' : illegal member initialization: 'A' is not a base or member

There are similar questions on SO but they relate to inheritance. Can someone explain the reason and what does standard say about that?

EDIT:

It would be better if someone elaborate more on the forwarding constructor and this feature in C++11.

like image 962
Coding Mash Avatar asked Oct 20 '12 11:10

Coding Mash


2 Answers

If you can use C++11, you could initialize A() from A(int, int). This is not possible in C++03, where you have to write two separate constructors.

If you want your code to work in C++03, you have two options:

  • Create a function init(int, int) and call it from each of your constructors. This is a good choice if your constructor does a lot of work.
  • Duplicate behaviour in both constructors. This is a good choice when all you are doing are member initializations.

You can also call a base constructor from a child class constructor. For instance, if you have

class A {
    A(int, int);
};
class B : public A {
    B(int, int);
};

You could write

B::B(int x, int y) : A(x,y) {}

This is what your compiler means when it says that A is not a base, it is expecting this situation.

All of these are compatible with C++03.

You could also upgrade your compiler to support C++11 features. I wouldn't recommend this if you are working in Linux and want your project to compile in Windows because Windows compilers don't implement all the C++ features that Linux compilers do (unless you pay for a good compiler).

like image 140
alestanis Avatar answered Sep 25 '22 10:09

alestanis


that's because of your problem with the constructor at :

From the looks of your error message, I am assuming you're on Visual Studio (probably 2010) and I agree, it doesn't work in VS2010.

A:A(0,0){ }

Fix for VS 2010 and its predecessors: A():a(0),b(0){}

like image 45
Aniket Inge Avatar answered Sep 23 '22 10:09

Aniket Inge