Динамический массив указателей с проблемой шаблона - PullRequest
0 голосов
/ 14 сентября 2018

Как динамически создать массив с этим классом (это библиотека Teensy Step для arduino):

class StepControl : IPitHandler, IDelayHandler
{
public:
...
   StepControl();
   template<size_t N> void move(Stepper* (&motors)[N], float relSpeed = 1);
...

и затем это использование этого класса , которое работает на 100% , но является статическим:

 Stepper J1(0, 1), J2(2, 3), J3(4, 5), J4(6, 7), J5(8, 9), J6(10, 11);
 StepControl <> controller;

 Stepper *robot[] = {&J1,&J2,&J3,&J4,&J5,&J6};
 controller.move(robot);

Я хочу сделать что-то вроде этого, но создать массив динамически:

 Stepper J1(0, 1), J2(2, 3), J3(4, 5), J4(6, 7), J5(8, 9), J6(10, 11);
 StepControl <> controller;

 int j = 4
 Stepper *robot[j];
 robot[0]=&J1;
 robot[1]=&J2;
 robot[2]=&J2;
 robot[3]=&J2;
 controller.move(robot);

Результат: ошибка: не найдена подходящая функция для вызова StepControl <> :: move (Stepper * [j]) '

Как это сделать?

Ответы [ 2 ]

0 голосов
/ 28 сентября 2018

Как и идея изменить образ жизни.Внедрит векторный интерфейс в библиотеку, чтобы вы могли использовать его в соответствии с предложением.

0 голосов
/ 14 сентября 2018

В настоящее время ваш метод 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...