Переменное число параметров и шаблон функции

Имею класс-шаблон реализующий матрицу (в ячейках могут быть разного типа данные).
для заполнения матрицы используется функция:

void setItems(int _row, int _col, ...){

    fieldInitialization(_row, _col);

    int argumentNumber = _row * _col;
    va_list arguments;
    va_start(arguments, argumentNumber);
    for (int i = 0 ; i < _row ; i++){
      for (int j = 0 ; j < _col ; j++){
        tab[i][j] = va_arg(arguments, T);
      }
    }
    va_end(arguments);
  }


Компилятор предупреждает:
second parameter of ‘va_start’ not last named argument [enabled by default]

и
- ‘char’ is promoted to ‘int’ when passed through ‘...’ [enabled by default]
	- (so you should pass ‘int’ not ‘char’ to ‘va_arg’)
	- if this code is reached, the program will abort


При заполнении int'ами всё ок,
как только перехожу на char программа останавливается как и предупреждал компилятор :(

Прошу подсказки/помощи как реализовать выемку аргументов зарание не зная тип.

p.s. задание учебное, потому нельзя, к примеру, воспользоватся специализацией.
  • Вопрос задан
  • 2891 просмотр
Решения вопроса 2
@malerix
Мне кажется, вот здесь ошибка:
va_start(arguments, argumentNumber);
Второй аргумент макроса va_start - это последний известный аргумент в функции. Компилятор даже вам об этом сообщает.
Например:
int magicFunction(int a, int b, int c, ...) {
    va_list args;
    va_start(args, c);
   //...
}

Следовательно, вам надо записать так:
va_start(arguments, _col);
Кстати, если у вас есть возможность воспользоваться отладчиком, посмотрите при вызове этой функции стек, и сравните адреса, в которых расположены argumentNumber и _col. Так что первый вариант (c int) тоже нерабочий.
Ответ написан
@drozdVadym
По стандарту при передачи значений через функцию переменного количества аргументов производятся приведения типов:
все что меньше int -> int
float -> double

По этому va_arg(some,char) никогда не будет корректным.

Можно конечно делать так:

char c = (char) va_arg(argptr, int);
float f = (float) va_arg(argptr, double);

Но в Вашем случае так не получится.

Или можете попробовать так:
template<class ElemT, class ArgsT>
void setItems(int _row, int _col, ...)
{
.......
        tab[i][j] = (ElemT) va_arg(arguments, ArgsT);
.......
}

template<char, int>(1, 1, 'a');


--------
P. S. Это задание такое передавать все элементы матрицы через аргументы?
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы