2016-09-19 2 views
-2
Matrix::Matrix(const i_list & list){ 

uint rows = list.size(); 
uint cols = list.begin()->size(); 
int cnt = 0; 
mtrx = new double*[rows]; 

    for(int j = 0; j < cols; j++){ 
    mtrx[j] = new double[cols]; 
    } 
    for(int k = 0; k < rows; k++){ 
    for(int l = 0; l < cols; l++){ 
     mtrx[k][l] = *(list.begin() + cnt); 
     cnt++; 
    } 
    } 

} 

Это держать дает мне ошибку:Создание конструктора матрицы с помощью initializer_list

Matrix.cpp:30:15: error: cannot convert ‘const 
std::initializer_list<double>’ to ‘double’ in assignment 
mtrx[k][l] = *(list.begin() + cnt); 
     ^

Есть ли способ, чтобы преобразовать его в дубль? Кастинг не работает.

+0

i_list определяется в моем файле .h ЬурейеЕ initializer_list > i_list; – CapnKirk

ответ

0

Ваш фрагмент не содержит определения i_list, но, похоже, это std::initializer_list из initializer_list s. Следовательно,

*(list.begin() + cnt); 

сам по себе является объектом initializer_list (внутренний один), а не double. Это сообщение об ошибке, которое вы получаете.

Вы можете превратить ваш двойную петлю, чтобы что-то вроде этого:

#include <algorithm> 

auto inner = std::begin(list); 
for(int k = 0; k < rows; ++k, ++inner) 
    std::copy(std::begin(*inner), std::end(*inner), &mtrx[k][0]); 

Это перебирает пункты list; для каждого из них он заменяет внутренний цикл вызовом std::copy.

0

На основе кода, я делаю вывод, что ваш i_list вложенная initializer_list так:

std::initializer_list<std::initializer_list<double>> 

Это означает, что при вызове *(list.begin() + cnt) (это еще один способ записи list.begin()[cnt]) вы не получите double элемент, но внутренний список в позиции cnt.

Чтобы получить элемент, вы должны сначала получить внутренний список в позиции k, а затем получить элемент в позиции l из этого списка:

mtrx[k][l] = list.begin()[k].begin()[l]; 
+0

Я пробовал это, и это дало мне следующее: Matrix.cpp: 30: 32: ошибка: нет соответствия для 'operator []' (типы операндов: 'const std :: initializer_list ' и 'int') mtrx [k] [l] = list.begin() [k] [l]; – CapnKirk

+0

@CapnKirk Исправлено. Забыл '.begin()' – Rufflewind

Смежные вопросы