Sign in to follow this  
steenreem

error: no matching function for call to Coordinate3d::Coordinate3d()'

Recommended Posts

steenreem    122
Hey, thanks for reading. I have this error: 'error: no matching function for call to `Coordinate3d::Coordinate3d()' Which occurs in the first line of the constructor function in the code below:
class IntDirection3d{
    Coordinate3d c;
    bool sign;

    public:
    IntDirection3d(Coordinate3d cpar, bool signpar){
        c = cpar; sign = signpar;
    }

    Coordinate3d GetCoordinate(){
        return c;
    };

    bool GetSign(){
        return sign;
    }
};
But I don't understand why the compiler requires me to define the function 'Coordinate3d::Coordinate3d()'. I don't see why it would be needed by IntDirection3d. Below is the Coordinate3d class, in which I have, on purpose, not defined the function 'Coordinate3d::Coordinate3d()'.
enum Coordinate3dValues {X,Y,Z};
class Coordinate3d{
    Coordinate3dValues value;

    public:
    Coordinate3d (Coordinate3dValues valuepar){
        value = valuepar;
    }

    Coordinate3dValues Get(){
        return value;
    }

    Coordinate3d operator=(Coordinate3d par){
        value = par.Get();
        return *this;
    }

    Coordinate3d Swap(bool forward){
        Coordinate3dValues val = (Coordinate3dValues)((value+sign(forward))%3);
        return Coordinate3dValues(val);
    }

    Coordinate3d Next(){
        return Swap(true);
    }
    Coordinate3d Previous(){
        return Swap(false);
    }

    IntDirection3d from(bool);
};

Share this post


Link to post
Share on other sites
Aardvajk    13207
Because you have defined other constructors, but not a default constructor, the compiler does not generate a default constructor for your coordinate class.

A default constructor is required when your InitDirect3d instance is created since it has to create the Coordinate3d member.

Initialiser lists are a solution here:


IntDirection3d(Coordinate3d cpar, bool signpar) : c(cpar),sign(signpar) {
/* c = cpar; sign = signpar; */
}


By doing an assignment as you were before in the constructor body, the compiler has to first construct a coordinate with a default constructor then assign to this instance with the assignment operator when it runs InitDirection3d's constructor body.

A type like a coordinate probably does want a default constructor though (that, say, sets its members to zero).

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this