2014-01-22 151 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

Visual Studio不能真正指出實際的錯誤是模板實例化失敗。 – Cubic

+0

@Cubic g ++爲同樣的問題返回113條無用線的錯誤消息。 'clang'錯誤:對二進制表達式無效的操作數('decltype(__ n + 0)'(又名'__gnu_cxx :: __ normal_iterator >')和'int') '也不是那麼好(其他47條也沒有幫助)。所以是的,我認爲這是公平的錯誤C++的設計,使幾乎不可能爲簡單的錯誤提供良好的錯誤信息。 – Voo