//template - std::vector - cannot convert cannot convert from 'std::_Vb_reference<_MycontTy>' to 'bool &'
-
wieso kommt bei foo1 eine Fehlermedlung?
template<typename T> class Klasse { public: Klasse() : member1(false) { member2.resize(1,false);} T& foo2() { return member1; } T& foo1() { return member2[0]; } private: T member1; std::vector<T> member2; }; int main() { Klasse<bool> zz; zz.foo1() =false ; //->error beim compilieren zz.foo2() =false ; }Fehler tritt weder bei int, float, double, etc. auf. Aber bei bool haut es nicht hin. (MSVC 2005 team edition + SP1)
error C2440: 'return' : cannot convert from 'std::_Vb_reference<_MycontTy>' to 'bool &' with [ _MycontTy=std::vector<bool,std::allocator<bool>> ] while compiling class template member function 'bool &Klasse<T>::foo1(void)' with [ T=bool ] see reference to class template instantiation 'Klasse<T>' being compiled with [ T=bool ]
-
Weil die Spezialisierung vector<bool> kein richtiger Container ist und auch keine bools speichert. Konsequenterweise ist der Rückgabetyp des Indexoperators auch keine richtige Referenz sondern ein Proxyobjekt.
-
kann man das irgendwie fixen? also so, dass das ganze auch für bools geht? ohne die klasse für bools zu spezialisieren?
-
tuts nicht auch ein anderer Container?
Sonst mach den Rückgabetyp von foo1 zu dem was vector<T>::operator[] zurück gibt: vector<T>::reference_type
-
typename vector<T>::reference foo1() { return member2[0]; }Wie pumuckl schon erwähnt hat ...
-
KasF schrieb:
typename vector<T>::reference foo1() { return member2[0]; }Wie pumuckl schon erwähnt hat ...
danke euch beiden. genau das was ich gesucht habe!
-
camper schrieb:
Weil die Spezialisierung vector<bool> kein richtiger Container ist und auch keine bools speichert. Konsequenterweise ist der Rückgabetyp des Indexoperators auch keine richtige Referenz sondern ein Proxyobjekt.
was genau speichert er dann? ein bool hat 1byte womit man an sich 7 Bits verschenkt.
andere Frage:
die rückgabe "typename std::vector<T>::reference" erfordert ggegn über T& für andere typen keine zusatzzeit, oder doch?anders: wo genau liegt der nachteil bei typename std::vector<T>::const_reference?
da der vector der datencontainer der matrixklasse ist, kann/möchte ich den vector auch nicht ändern
-
vector<bool> wird so optimiert sein, dass eben nicht 7 Bit pro Flag verschenkt werden. Wie genau er das macht, bleibt aber der Implementierung überlassen. Möglicherweise speichert er ein Array von Bytes und holt die einzelnen Flags mit Bitschubserei dort raus.
Bei der Benutzung von typedefs hast Du grundsätzlich erstmal garkeine Nachteile, da das alles zur Compilierungszeit aufgelöst wird. Zur Laufzeit gibt es keine Typen mehr. Natürlich könnte das, was vector<bool>::reference ist, bei bestimmten Folgeoperationen (z.B. bei der Zuweisung eines Wertes) langsamer sein als ein bool&, aber das ist nicht von Interesse, da der vector<bool> eben keine bool& enthält. Du hast sogar einen großen Vorteil: Egal ob vector<bool> oder sonst irgendein Typ, Du hast mit vector<T>::reference immer den Typ, den operator[] zurückgibt, auch wenn es nicht T& ist.
Der Nachteil (?) von const_reference ggü. reference ist, dass der Wert konstant ist.
-
Wenn du den Inhalt des Vectors nicht ändern willst, sprich die einzelnen Bools nicht verändern willst, dann kannst du const_reference nehmen, musst dann aber schauen, dass foo1 auch als const deklariert ist. Denn nur wenn das Objekt udn damit der vector const ist, wirst du von C++ auch ne const_reference bekommen.
-
muffmolch schrieb:
anders: wo genau liegt der nachteil bei typename std::vector<T>::const_reference?
sorry. mein fehler... copy&paste

meinte natrülich nachteil zwischen T& und std::vector<T>::reference...
das "const_" war drinnen, da ich unsere matirx klassen grad angepaßt habe und beim const operator() braucht man auch ne const_reference...danke für die ausführliche erklärung des sachverhaltes.. wieder was gelernt!
-
pumuckl schrieb:
Wenn du den Inhalt des Vectors nicht ändern willst, sprich die einzelnen Bools nicht verändern willst, dann kannst du const_reference nehmen, musst dann aber schauen, dass foo1 auch als const deklariert ist. Denn nur wenn das Objekt udn damit der vector const ist, wirst du von C++ auch ne const_reference bekommen.
Das ist nicht notwendig. reference muss immer in const_reference konvertierbar sein. Natürlich ist es denkbar, dass die direkte Berechnung von const_reference effizienter ist oder andere Vorteile hat (z.B. bei basic_string).