Я хочу написать очень простую функцию, которая создает матрицу определенного размера с функцией, которая позволяет мне инициализировать элементы в матрице. Простые вещи, но я хотел попробовать еще несколько возможностей C++ 11 в одно и то же время.Инициализация матрицы 2d с элементами
template<class T, class Generator>
vector<vector<T> > create_matrix(int nr_rows, int nr_cols, Generator& gen) {
vector<vector<T> > matrix(nr_rows, vector<T>(nr_cols));
for (auto& row : matrix) {
generate_n(row.begin(), row.end(), gen);
}
return matrix;
}
// calling code
mt19937 engine;
uniform_int_distribution<int> dist(0, 9);
vector<vector<int> > matrix_a = create_matrix<int>(3, 4, [&]() {
return dist(engine);
});
компиляция завершается с
1>C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\algorithm(1562): error : no operator "+" matches these operands
1>C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\algorithm(1532): error : no operator "<" matches these operands
под Visual Studio 2012 (CUDA SDK не имеет официальной поддержки VS2013, так что нет возможности). Итак, что я делаю неправильно и как это исправить?
Это не ошибка C++ в том, что визуальная студия не указывает, что фактическая ошибка заключается в том, что экземпляр шаблона терпит неудачу. – Cubic
@Cubic g ++ для этой же задачи возвращает сообщение об ошибке из 113 бесполезных строк. clang's error: недопустимые операнды для двоичного выражения ('decltype (__ n + 0)' (aka '__gnu_cxx :: __ normal_iterator>>') и 'int') 'также не намного лучше (47 других линий тоже не помогают). Так что да, я считаю, что это справедливо для C++ для дизайна, что делает почти невозможным предоставление хороших сообщений об ошибках для простых ошибок. –
Voo