Menos mal que fue un título largo.Operador sobrecargado [] en la clase de plantilla en C++ con versiones const/nonconst
Aquí está mi problema. Tengo una clase de plantilla en C++ y estoy sobrecargando el operador []. Tengo tanto una constante y una versión no constante, con la versión no constante retorno por referencia de manera que los elementos de la clase se pueden cambiar como tan:
myobject[1] = myvalue;
Todo esto funciona hasta que yo utilizo un booleano como el parámetro de la plantilla. Aquí está un ejemplo completo que muestra el error:
#include <string>
#include <vector>
using namespace std;
template <class T>
class MyClass
{
private:
vector<T> _items;
public:
void add(T item)
{
_items.push_back(item);
}
const T operator[](int idx) const
{
return _items[idx];
}
T& operator[](int idx)
{
return _items[idx];
}
};
int main(int argc, char** argv)
{
MyClass<string> Test1; // Works
Test1.add("hi");
Test1.add("how are");
Test1[1] = "you?";
MyClass<int> Test2; // Also works
Test2.add(1);
Test2.add(2);
Test2[1] = 3;
MyClass<bool> Test3; // Works up until...
Test3.add(true);
Test3.add(true);
Test3[1] = false; // ...this point. :(
return 0;
}
El error es un error del compilador y el mensaje es:
error: invalid initialization of non-const reference of type ‘bool&’ from a temporary of type ‘std::_Bit_reference’
He leído y encontré que STL utiliza algunos tipos de datos temporales, pero No entiendo por qué funciona con todo, excepto un bool.
Cualquier ayuda sobre esto sería apreciada.
leer este artículo: http://www.gotw.ca/publications/mill09.htm –
Puede ser fijo. Vea abajo. Solo necesita devolver el mismo tipo que el operador [] devuelve (que generalmente es T & (pero no siempre como en el caso del vector)) –