views:

53

answers:

2

Right now I have a class A that inherits from class B, and B does not have a default constructor. I am trying the create a constructor for A that has the exact same parameters for B's constructor, but I get:

error: no matching function for call to ‘B::B()’
note: candidates are: B::B(int)

How would I fix this error?

+1  A: 

You need to invoke the base constructor via your class' initializer list.

Example:

class C : public B
{
public:
    C(int x) : B(x)
    {
    }

};

When you don't initialize B explicitly it will try to use the default constructor which has no parameters.

Brian R. Bondy
+2  A: 

The constructor should look like this:

A(int i) : B(i) {}

The bit after the colon means, "initialize the B base class sub object of this object using its int constructor, with the value i".

I guess that you didn't provide an initializer for B, and hence by default the compiler attempts to initialize it with the non-existent no-args constructor.

Steve Jessop
Thanks for explaining what that means, Steve! I didn't realize there was an initializer
wrongusername
Yes, base classes and all members are always "initialized" somehow before entering the body of the constructor. You can specify how, or you can take the default. Confusingly, for fundamental types and POD structs, default initialization doesn't actually do anything, leaving those values "uninitialized", but it still nominally happens. For types which don't have a default constructor, you need to say which constructor to call and how.
Steve Jessop