I have been trying to resolve an undefined reference error for hours caused by my 2D array, but I don't know what I am missing. I have a 2D array.
#include <iostream>
#include "ServoJoint.h"
#include "JointedLeg.h"
#include "TwoJointLeg.h"
#include "ThreeJointLeg.h"
int main() {
    //2D array containing the 7 calibrated positions for each of the 10 servo motors
    size_t servoCalibrations[10][7]={{143, 190, 245, 305, 365, 410, 467},
                                     {143, 205, 260, 320, 377, 423, 475},
                                     {115, 168, 230, 280, 340, 392, 440},
                                     {130, 182, 235, 290, 340, 397, 455},
                                     {135, 190, 235, 290, 345, 400, 455},
                                     {140, 190, 250, 305, 355, 415, 465},
                                     {130, 185, 240, 300, 355, 415, 465},
                                     {140, 200, 245, 300, 355, 410, 460},
                                     {140, 200, 245, 300, 355, 410, 460},
                                     {140, 200, 245, 300, 355, 410, 460}};
    double walkCycle[4][2]= {{45, 45},
                            {60, 150},
                            {60, 135},
                            {30, 60}};
    //Array of pointers to 10 size_t arrays of size 7
    //This is because C++ doesn't allow accessing an entire row/column of a 2D array
    //or I don't know how to
    size_t * calibrationArrays[10];
    for(size_t i=0; i<10; i++){
        size_t * tmp= new size_t[7];
        for(size_t j=0; j<7; j++){
            tmp[j]= servoCalibrations[i][j];
        }
        calibrationArrays[i]= tmp;
    }
    //Array of pointers to 10 ServoJoint objects
    ServoJoint * servoJoints[10];
    //Dynamically allocate 10 ServoJoint objects
    for(size_t i=0; i<10; i++){
        servoJoints[i]= new ServoJoint(i, 7, calibrationArrays[i]);
    }
    for(size_t i=0; i<10; i++){
        std::cout << "Servo motor " << i+1 << " has the following PWM values: ";
        for(size_t j=0; j<7; j++){
            std::cout << servoJoints[i]->getPWM(-90+(double)(j*30)) << " ";
        }
        std::cout<< std::endl;
    };
    //Array of pointers to 2 ThreeJointLeg objects
    ThreeJointLeg * threeJointLegs[2];
    //Dynamically allocate 2 ThreeJointLeg objects
    for(size_t i=0; i<6; i+=3){
        threeJointLegs[i]= new ThreeJointLeg(servoJoints[i], servoJoints[i+1], servoJoints[i+2], 1-(i%2)*2, walkCycle);
    }
    //Array of pointers to 2 TwoJointLeg objects
    TwoJointLeg * twoJointLegs[2];
    //Dynamically allocate 2 TwoJointLeg objects
    for(size_t i=6; i<10; i+=2){
        twoJointLegs[i]= new TwoJointLeg(servoJoints[i],servoJoints[i+1], 1, walkCycle);
    }
    return 0;
}
JointedLeg.h:
#ifndef ROBOTLEG_JointedLeg_H
#define ROBOTLEG_JointedLeg_H
#include "ServoJoint.h"
class JointedLeg{
private:
//Pointers to the 2 ServoJoint objects for the upper and lower joint
ServoJoint * upperJoint;
ServoJoint * lowerJoint;
int isRight;
//2D array, where each of the four rows represents each phase in the walk cycle and each column of each row
//represents the upper and lower joint angles respectively
//walkCycle[0][]= home
//walkCycle[1][]= step forward
//walkCycle[2][]= step down
//walkCycle[3][]= step back
double walkCycle[4][2];
public:
JointedLeg(ServoJoint * joint1, ServoJoint * joint2, int side, double givenWalk[][2]);
JointedLeg.cpp:
#include "JointedLeg.h"
JointedLeg::JointedLeg(ServoJoint * joint1, ServoJoint * joint2, int side, double givenWalk[][2]):upperJoint(joint1), lowerJoint(joint2), isRight(side){
    for(size_t i=0; i<4; i++){
        for(size_t j=0; j<2; j++){
            walkCycle[i][j]= givenWalk[i][j];
        }
    }
}
TwoJointLeg.h:
#ifndef QUADRUPEDROBOT_TWOJOINTLEG_H
#define QUADRUPEDROBOT_TWOJOINTLEG_H
#include "JointedLeg.h"
class TwoJointLeg : public JointedLeg{
public:
    TwoJointLeg(ServoJoint * joint1, ServoJoint * joint2, int side, double givenWalk[][2]);
};
#endif //QUADRUPEDROBOT_TWOJOINTLEG_H
TwoJointLeg.cpp:
#include "TwoJointLeg.h"
TwoJointLeg::TwoJointLeg(ServoJoint * joint1, ServoJoint * joint2, int side, double givenWalk[][2])
        :JointedLeg(joint1, joint2, side, givenWalk){}
and I wish to pass this as a parameter to the following constructor:
JointedLeg(ServoJoint * joint1, ServoJoint * joint2, int side, double givenWalk[][2]);
I read on Passing a 2D array to a C++ function that when I declare a 2D array with 2 brackets, i.e. [][], I can do the same in the function header and simply pass the array variable name, which is what I believe I have done.
However, my compiler keeps telling me that I am passing a "double (*) [2]." I am aware that a 2D array is technically a pointer to sub-arrays and that the first array can be decayed to a pointer, but why is there a mismatch in the parameter type when I have the same syntax in the function call and the definition?
I've tried both of these in the function header:
double givenWalk[4][2]
double givenWalk[][2]
 
     
     
    