Compatibilidad con “para cada uno” en la clase de contenedor de C ++ nativo const. Personalizada

Me gustaría implementar una clase de plantilla de matriz de capacidad fija C ++ nativa simple, que admita la syntax basada en rango “para cada” para mayor comodidad, con una sobrecarga mínima.

Estoy teniendo problemas para soportarlo en casos const.

Con esta implementación:

template class List { public: List() { mSize = 0; } const T* begin() const { return mItems; } const T* end() const { return mItems + mSize; } T* begin() { return mItems; } T* end() { return mItems + mSize; } private: size_t mSize; T mItems[ Capacity ]; }; 

y este uso:

 const List myInts; for each( const int myInt in myInts ) { continue; } 

Me sale este error:

 error C2440: 'initializing' : cannot convert from 'const int *' to 'int *' Conversion loses qualifiers 

Este uso no se queja:

 List myInts; for each( const int myInt in myInts ) { continue; } 

Y esta implementación (indeseable) no se queja:

 template class List { public: List() { mSize = 0; } T* begin() const { return const_cast( this )->mItems; } T* end() const { return const_cast( this )->mItems + mSize; } private: size_t mSize; T mItems[ Capacity ]; }; 

¿Qué está pasando bajo el capó que no estoy entendiendo? ¿De qué se trata std :: vector que maneja esto correctamente? ¡Gracias!

Su caso de uso me parece un poco extraño, ya que no hay ninguna para cada construcción en C ++ tal como la ha escrito. Hay un estándar for y basado for rango for introducirse en C ++ 11. Solo puedo adivinar cuál es su caso de uso real, pero lo más probable es que el comstackdor se queje debido a un error de corrección constante. Realmente no puedo precisar su error exactamente sin un código real que está intentando ejecutar. En cualquier caso, a continuación se muestra un ejemplo de trabajo que demuestra ambos usos. Espero que sea útil, pero si tiene alguna pregunta, no dude en hacer un seguimiento, intentaré explicarlo.

 #include  #include  template  class List { public: List() : mSize(0) {} const T *begin() const { return mItems; } const T *end() const { return mItems + mSize; } T *begin() { return mItems; } T *end() { return mItems + mSize; } void add(int v) { // TODO: Check for out of range here... mItems[mSize++] = v; } private: size_t mSize; T mItems[Capacity]; }; int main() { /* const */ List array; array.add(1); array.add(11); array.add(15); array.add(3); // C++11 style (range-based for) for (int p : array) { std::cout << p << '\n'; } // Pre C++11 style for (const int *from = array.begin(), *to = array.end(); from != to; ++from) { int p = *from; std::cout << p << '\n'; } }