C ++ - возврат константного вектора константных векторов константных объектов - PullRequest
1 голос
/ 18 июля 2011

Я анализирую файл и создаю вектор вектора объектов Foo.

vector< vector<Foo*> > mFooVectors;

Я должен разрешить доступ с помощью следующей функции getFoos.

const vector<const Foo*>&         getFoos(int index); 

Итак, я создал константное объявление моего вектора:

const vector< const vector<const Foo*> > mConstFooVectors;

Теперь, как мне сделать mConstFooVectors = mFooVectors, чтобы я мог вернуть ссылку на mConstFooVectors?

Ответы [ 4 ]

8 голосов
/ 18 июля 2011

Вы не можете добавить const на любом данном уровне.Различные экземпляры шаблона - это разные несвязанные типы, vector<T> не связан с vector<const T>, и нет способа приведения от одного к другому.

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

Кстати, если вы возвращаете константную ссылку навнешний вектор, ссылка const будет вести себя как: const std::vector< const std::vector< Foo * const > >&, обратите внимание, что из-за семантики значений, связанных с типами в C ++, const-ness распространяется in. Проблема заключается в том, что значение хранится во внутреннейvector - это указатель, и его постоянство не делает указатель на объект постоянным.Точно так же поведение вашего getFoos(int) будет эквивалентно const std::vector< Foo * const >&.Обратите внимание, что поведение не актуально типы .

1 голос
/ 18 июля 2011

Я не знаю, что вы пытаетесь сделать, но я бы посмотрел на boost :: ptr_vector

Специально, ваш вектор-член может потенциально утечь, если вы не обработаете его правильно... (RAII)

0 голосов
/ 18 июля 2011

Вы смешиваете

vector<const Foo *>

с

vector<Foo *>

Вы должны решить, какой из них вы хотите - нет способа конвертировать из одного в другой (без копирования).

0 голосов
/ 18 июля 2011

конструктор копирования вектора должен быть в состоянии обработать его , но вам придется сделать это в списке инициализатора конструктора вашего класса, поскольку он является константным членом.

Редактировать: Это было неправильно ... Конструктор копирования Vector не может с этим справиться. См. Статью Дэвида Родригеса для объяснения (вектор и вектор не связаны между собой).

...