Hej udviklere,
jeg har en templated klasse 'Grid<T>' der arver fra std::vector<T> (det er reelt en 2d-vector, og arver altså faktisk fra std::vector<std::vector<T> > ).
For at kunne bruge STL <algorithm>'er på min container, har jeg lavet en iterator ('class Grid<T>::iterator : public std::iterator<std::bidirectional_iterator_tag, T>'), der kan gå igennem mit Grid fra .begin() til .end().
Problemet er: når jeg laver et Grid<bool> (dvs T = bool) giver min iterator mig problemer med compileren (MinGW). Jeg får:
H:\Dokumenter\C++\Projects\LifeGrid\LifeGrid\core\Grid.h||In member function `T& Grid<T>::iterator::operator*() [with T = bool]':|
H:\Dokumenter\C++\Projects\LifeGrid\LifeGrid\core\GeoMap.cpp|38|instantiated from here|
H:\Dokumenter\C++\Projects\LifeGrid\LifeGrid\core\Grid.h|239|error: invalid initialization of non-const reference of type 'bool&' from a temporary of type 'std::_Bit_reference'|
der så vidt jeg kan gennemskue fortæller mig at jeg ikke må dereferere en pointer til en bool i en std::vector.
Jeg dereferer pointeren her (linie 38 i GeoMap.cpp):
for (GeoMap::iterator iter = this->begin(); iter != this->end(); ++iter)
{
c = SQS_file.get();
if (c==10) c = SQS_file.get(); //ignore the endlines
*iter = bool(c-48); // subtract 48 to go from char to int (ascii) // line 38!
}
Linie 239 i Grid.h, hvor iterator operationen defineres, ser således ud:
T&
operator*()
{
return *cell_iter; //line 239
}
//cell_iter er en almindelig std::vector<T>::iterator
Det ser jo tilforladeligt ud, og fungerer for alle andre typer. Jeg går ud fra at problemet er at vector<bool> er implementeret som bits, for at gøre den mere effektiv. Jeg kunne godt tænke mig at udnytte denne effektivitet, da jeg har nogle tusind potentielle Grid<bool> objekter i spil, à et par tusind felter hver - lige nu bruger jeg <int>, men det går langsomt og tager hukommelse.
Spørgsmålet er: kan jeg implementere min iterator (eller gøre noget andet smart), så jeg ikke får <bool> problemet?
Tak,
Indlæg senest redigeret d. 15.10.2008 12:19 af Bruger #8249