问题
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.
回答1:
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).
回答2:
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){}
回答3:
You can not do this way A() :A(0,0){};
this way is used to initialize class base members.
A(){a=0;b=0;};
or if you wish define private: void set(int x, int y);
and use it in constructors.
回答4:
A() :A(0,0){};
is called constructor chaining.
You should check that you compiler accept C++11. Constructor chaining is only valid in C++11. It was not available before.
What compiler do you use ?
回答5:
You are attempting to use a delegating constructor, which is a language feature that was only introduced in C++11
, and which is not yet implemented in every compiler.
来源:https://stackoverflow.com/questions/12988048/illegal-member-initialization