Ответ 1
Вас укусил еще один побочный эффект "волшебства" std::vector<bool>
.
Так как std::vector<bool>
фактически не сохраняет смежный массив bool
s, но упаковывает их как битовый набор, он не может вернуть "реальную" ссылку на бит в середине битового набора (поскольку бит aren ' t непосредственно адресуемый); по этой причине его operator[]
возвращает прокси-объект, который, перегружая его operator=
, "подделывает" ссылочную семантику.
Проблема здесь: этот прокси-объект не является bool &
, поэтому вы не можете вернуть его как таковой в свой метод.
Самый простой способ решить будет примерно так:
typename std::vector<T>::reference operator[](int i) {
return elements[i];
}
typename std::vector<T>::const_reference operator[](int i) const {
return elements[i];
}
который гарантирует, что вы фактически возвращаете любой тип std::vector
, используемый в качестве "ссылки на T
" в его методах.
Кроме того, вы можете использовать std::vector<T>::size_type
для индексов (в основном для согласованности ваших функций пересылки, чем что-либо еще).