2014-01-22 4 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); 
}); 

컴파일 비주얼 스튜디오 2012 (즉, NO 옵션 없다 그래서 CUDA SDK는 VS2013에 대한 공식 지원하지 않습니다)에서

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 

실패합니다. 그래서 내가 뭘 잘못하고 그것을 고치는 법?

답변

0

실수로 - generate_n은 반복자가 아닌 두 번째 인수로 size 매개 변수를 사용합니다. 오류 메시지가 완전히 쓸모가 없어야하는 이유는 무엇입니까? 그렇지만 C++입니다. 그 밖의 무엇을 기대합니까?

+0

Visual Studio에서 실제 오류가 템플릿 인스턴스화에 실패했다는 사실을 나타내지 않는 것은 C++의 잘못이 아닙니다. – Cubic

+0

같은 문제에 대한 @Cubic g ++은 도움이되지 않는 113 줄의 오류 메시지를 반환합니다. clang의 오류 : 이진 표현식에 대한 잘못된 피연산자 ('decltype (__ n + 0)'(일명 '__gnu_cxx :: __ normal_iterator >'및 'int')) '그다지 좋지는 않습니다 (47 개의 다른 라인도 도움이되지 않습니다). 그래서 네, 나는 C++을 단순한 오류에 대한 좋은 오류 메시지를 제공하는 것을 거의 불가능하게 만드는 오류 때문에 잘못했다고 생각합니다. – Voo