В настоящее время ваш метод StepControl::move()
написан так, чтобы принимать только массивы, размер которых известен на время компиляции . Это означает, что если компилятор может определить размер массива, например:
// size is inferred at compile time to be 6
Stepper* robot[] = {&J1,&J2,&J3,&J4,&J5,&J6};
, тогда компилятор может успешно сопоставить controller.move(robot);
со следующим экземпляром шаблона:
void move<>(Stepper* (&motors)[6], float relSpeed = 1);
Но, не зная во время компиляции, каким будет размер вашего массива, компилятор не может сопоставить вызов move
с конкретным созданием шаблона. Когда вы пишете
int j = 4;
Stepper *robot[j];
Поскольку j
не является константой времени компиляции, robot
на самом деле является массивом стеков динамического размера , который является нестандартным. Некоторые компиляторы допускают это, но в результате этого размер robot
не может быть известен во время компиляции.
<Ч />
Чтобы исправить это, вы всегда можете быть уверены в размере вашего массива во время компиляции, например:
if (needsToBeSix){
Stepper *robots[6] = ...;
controller.move(robots);
} else if (needsToBeFour){
Stepper *robots[4] = ...;
controller.move(robots);
}
Или, если вам действительно нужны массивы динамического размера, используйте std::vector
:
class StepControl {
...
void move(std::vector<Stepper*>& motors, float relSpeed = 1){
// size can be queried at runtime as follows
const size_t N = motors.size();
// rest of method;
}
...
}
...
std::vector<Stepper*> robot { &J1, &J2, &J3, &J4 };
if (needTwoMore){
robot.push_back(&J5);
robot.push_back(&J6);
}
controller.move(robot);