вектор, содержащий матрицы только для чтения? - PullRequest
3 голосов
/ 17 июня 2010

Я хочу использовать вектор для хранения целочисленных матриц только для чтения размером 5x5

vector<const int[5][5]> startingPieces;

Но это объявление вызывает кучу странных ошибок, которых я никогда раньше не видел.

error C2535: 'const int (*std::allocator<_Ty>::address(const int (&)[5][5]) const)[5][5]' : member function already defined or declared
1>        with
1>        [
1>            _Ty=const int [5][5]
1>        ]
1>        c:\program files\microsoft visual studio 9.0\vc\include\xmemory(109) : see declaration of 'std::allocator<_Ty>::address'
1>        with
1>        [
1>            _Ty=const int [5][5]
1>        ]
1>        c:\program files\microsoft visual studio 9.0\vc\include\vector(429) : see reference to class template instantiation 'std::allocator<_Ty>' being compiled
1>        with
1>        [
1>            _Ty=const int [5][5]
1>        ]
1>        c:\program files\microsoft visual studio 9.0\vc\include\vector(439) : see reference to class template instantiation 'std::_Vector_val<_Ty,_Alloc>' being compiled
1>        with
1>        [
1>            _Ty=const int [5][5],
1>            _Alloc=std::allocator<const int [5][5]>
1>        ]
1>        c:\users\eric\documents\visual studio 2008\projects\testing grounds\testing grounds\main.cpp(14) : see reference to class template instantiation 'std::vector<_Ty>' being compiled
1>        with
1>        [
1>            _Ty=const int [5][5]
1>        ]

Итак, что же не так с этим объявлением?

Ответы [ 3 ]

7 голосов
/ 17 июня 2010

Две вещи - во-первых, векторы не могут содержать объекты const - см. Могу ли я использовать const в векторах, чтобы разрешить добавление элементов, но не модификацию уже добавленных? для обсуждения этого. И, во-вторых, они не могут содержать массивы, поскольку вещи, которые они содержат, должны быть копируемыми и назначаемыми, а массивы - ни тем, ни другим.

2 голосов
/ 17 июня 2010

Что вы должны сделать здесь, это создать свой собственный матричный класс, который хранит массив данных 5x5, а затем создать вектор с этим.

1 голос
/ 17 июня 2010

Один из вариантов - использовать класс array (ваша реализация может поддерживать std::array или std::tr1::array; если нет, вы можете использовать boost::array из библиотек Boost):

std::vector<std::array<std::array<int, 5> > >

Элементы, хранящиеся в контейнере, все еще не могут быть постоянными;Вы можете сделать весь вектор const, если это подходит для вашего варианта использования.

...