2014-01-22 2 views
0

Я хочу написать очень простую функцию, которая создает матрицу определенного размера с функцией, которая позволяет мне инициализировать элементы в матрице. Простые вещи, но я хотел попробовать еще несколько возможностей 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, так что нет возможности). Итак, что я делаю неправильно и как это исправить?

ответ

0

Глупая ошибка - generate_n принимает параметр размера, поскольку второй аргумент не является итератором. Почему, черт возьми, сообщения об ошибках должны быть совершенно бесполезны, но мне кажется, что это C++ - что еще я ожидаю?

+0

Это не ошибка C++ в том, что визуальная студия не указывает, что фактическая ошибка заключается в том, что экземпляр шаблона терпит неудачу. – Cubic

+0

@Cubic g ++ для этой же задачи возвращает сообщение об ошибке из 113 бесполезных строк. clang's error: недопустимые операнды для двоичного выражения ('decltype (__ n + 0)' (aka '__gnu_cxx :: __ normal_iterator >>') и 'int') 'также не намного лучше (47 других линий тоже не помогают). Так что да, я считаю, что это справедливо для C++ для дизайна, что делает почти невозможным предоставление хороших сообщений об ошибках для простых ошибок. – Voo

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