Я реализую Matrix с общим вектором общих векторов (vector<vector<T>>).
Мой конструктор получает вектор векторов и инициализирует элемент данных с помощью CCTOR, предоставляемого библиотекой. Когда я пытаюсь инициализировать матрицу с помощью агрегированной инициализации, работает следующая строка кода: Matrix<int> mat({ {1, 2, 3} });
Но следующий нет: Matrix<int> mat({ {1, 2, 3}, {4, 5 ,6} });
Ошибки нет. Просто, казалось бы, бесконечный цикл.
Мне здесь явно чего-то не хватает. В чем моя ошибка?
Вот мое определение матрицы:
template<class T>
class Matrix {
private:
int _height;
int _length;
vector<vector<T>> _val;
public:
Matrix(vector<vector<T>> val) throw (const char*) :_height(val.size()), _length((*val.begin()).size()), _val(val) {
// Checking if the rows are of different sizes.
vector<vector<T>>::iterator it = val.begin();
it++;
while (it != val.end()) {
if ((*it).size() != _length) {
throw "EXCEPTION: Cannot Create Matrix from Vectors of Different Sizes.";
}
}
}
}
Также есть функция вывода, но я не думаю, что это имеет к ней какое-то отношение.
@ L.Kue добавил мой матричный код (CTOR и датамеры). И здесь нет ошибки, просто бесконечный цикл.
@Marker добавил это.





В вашем определении конструктора Matrix есть бесконечный цикл, потому что вы не обновляете свой итератор.
В этой части вашего кода
while (it != val.end()) {
if ((*it).size() != _length) {
throw "EXCEPTION: Cannot Create Matrix from Vectors of Different Sizes.";
}
}
Вы смотрите на первый элемент вектора и сравниваете его с _length, а затем снова проверяете, находитесь ли вы в конце вектора, не перемещая итератор.
Чтобы исправить это, измените свой конструктор на это:
Matrix(vector<vector<T>> val) throw (const char*) :_height(val.size()), _length((*val.begin()).size()), _val(val) {
// Checking if the rows are of different sizes.
auto it = val.begin();
while (it != val.end()) {
if ((*it).size() != _length) {
throw "EXCEPTION: Cannot Create Matrix from Vectors of Different Sizes.";
}
++it; // this line is added
}
}
Таким образом, ваш итератор будет обновляться каждый цикл. Также обратите внимание, что throw (const char*) устарел. Вместо этого рассмотрите возможность использования noexcept(false). И пока вы это делаете, конструкторы с одним аргументом должны быть помечены как explicit, чтобы избежать неявного преобразования типов.
Обновлено: Также стоит посмотреть: Почему «использование пространства имен std» считается плохой практикой?
Ой. Вот и все. Большое спасибо, не могу поверить, что забыл обновить итерацию!
Что за сообщение об ошибке? Как выглядит ваш код в
Matrix? Этой информации недостаточно, чтобы составить точку зрения.