c++: operator>> in std::vector<bool> geht nicht

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
daedalus
Beiträge: 286
Registriert: 04.02.2005 17:06:16

c++: operator>> in std::vector<bool> geht nicht

Beitrag von daedalus » 26.07.2006 15:25:02

Hallo,

bisher habe ich mich nicht daran gestört, dass der std::vector<bool> anders implementiert ist als alle anderen "vector"s, da es mir nicht weiter aufgefallen ist (std::vector<bool> verwendet ein Bit zur Speicherung des Wertes und hat deshalb eine extra Implementierung, da somit die Elemente nicht mehr einfach so adressiert werden können; siehe Stroustrup 16.3.11 (3. Auflage)).
Als ich aber letztens einen std::vector<bool> mit dem operator<< ausgeben wollte, kamen recht viele recht kryptische Fehlermeldungen (es ging natürlich mit folgendem code:)

Code: Alles auswählen

std::vector<bool> v(10);
bool temp = v[2]; // std::cout<<v[2]; geht nicht!
std::cout<<temp;
Meine Frage: ist das ein Problem der Implementierung der STL unter Linux oder ist das "so gewollt" oder besser: unter anderen Betriebssystemen genauso (...also nur für die Portabilität)?
Zuletzt geändert von daedalus am 26.07.2006 20:06:19, insgesamt 1-mal geändert.
Das Problem ist der Parser. Der ist nicht fuzzy genug.
--Klaus Knopper

hirube
Beiträge: 68
Registriert: 14.09.2005 10:09:15

Beitrag von hirube » 26.07.2006 16:58:15

Keine Ahnung, wie es gewollt ist bzw. sein sollte.

Unter Windows 2000 mit Visual Studio 2003 geht's auch zusaetzliche Zwischenvariable.

daedalus
Beiträge: 286
Registriert: 04.02.2005 17:06:16

Beitrag von daedalus » 26.07.2006 17:05:37

>Unter Windows 2000 mit Visual Studio 2003 geht's auch [???]zusaetzliche Zwischenvariable.

Danke für die Antwort (und fürs ausprobieren), aber die wesentliche Angabe, ob nun *mit* oder *ohne* hast Du vergessen ;-)
Das Problem ist der Parser. Der ist nicht fuzzy genug.
--Klaus Knopper

hirube
Beiträge: 68
Registriert: 14.09.2005 10:09:15

Beitrag von hirube » 26.07.2006 17:55:26

Oooops!

- ohne -

hirube
Beiträge: 68
Registriert: 14.09.2005 10:09:15

Beitrag von hirube » 26.07.2006 17:55:41

Oooops!

- ohne -

Benutzeravatar
GoKi
Beiträge: 2068
Registriert: 04.07.2003 23:08:56
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von GoKi » 26.07.2006 19:36:36

Was war denn das für ein Fehler?
Habe gerade folgendes ohne Probleme ausprobiert

Code: Alles auswählen

#include <iostream>
#include <vector>

int main()
{
   std::vector<bool> v(10);
   std::cout << v[2] << std::endl;
}
mit

Code: Alles auswählen

$ g++ --version
g++ (GCC) 4.0.4 20060507 (prerelease) (Debian 4.0.3-3)
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
MfG GoKi
:wq

daedalus
Beiträge: 286
Registriert: 04.02.2005 17:06:16

Beitrag von daedalus » 26.07.2006 20:04:25

Argh. Ich sollte meine Beispiele ausprobieren, bevor ich sie poste. Bitte vielmals um Entschuldigung, ich habe zu schnell auf den allgemeinen Fall geschlossen. Es handelt sich definitiv um einen Bug: der Code

Code: Alles auswählen

#include <vector>
#include <iostream>
#include <fstream>

int main()
{
        std::vector<bool> b(10);
        std::ifstream ifs("test");
        ifs>>b[1];
}
spuckt mit Fehlern um sich, macht man aus dem <bool> ein <char> o.a., geht es. Die Ausgabe per ofstream geht auch.

g++ Version: wie Deine

Fehler:

Code: Alles auswählen

main.cpp: In function 'int main()':
main.cpp:9: error: no match for 'operator>>' in 'ifs >> b. std::vector<bool, _Alloc>::operator[] [with _Alloc = std::allocator<bool>](1u)'
/usr/lib/gcc/i486-linux-gnu/4.0.4/../../../../include/c++/4.0.4/istream:131: note: candidates are: std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(std::basic_istream<_Char
T, _Traits>& (*)(std::basic_istream<_CharT, _Traits>&)) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i486-linux-gnu/4.0.4/../../../../include/c++/4.0.4/istream:134: note:                 std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(std::basic_ios<_CharT, _
Traits>& (*)(std::basic_ios<_CharT, _Traits>&)) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i486-linux-gnu/4.0.4/../../../../include/c++/4.0.4/istream:137: note:                 std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(std::ios_base& (*)(std::
ios_base&)) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i486-linux-gnu/4.0.4/../../../../include/c++/4.0.4/istream:169: note:                 std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(bool&) [with _CharT = ch
ar, _Traits = std::char_traits<char>]
/usr/lib/gcc/i486-linux-gnu/4.0.4/../../../../include/c++/4.0.4/istream:172: note:                 std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(short int&) [with _CharT
 = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i486-linux-gnu/4.0.4/../../../../include/c++/4.0.4/istream:175: note:                 std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(short unsigned int&) [wi
th _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i486-linux-gnu/4.0.4/../../../../include/c++/4.0.4/istream:178: note:                 std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(int&) [with _CharT = cha
r, _Traits = std::char_traits<char>]
/usr/lib/gcc/i486-linux-gnu/4.0.4/../../../../include/c++/4.0.4/istream:181: note:                 std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(unsigned int&) [with _Ch
arT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i486-linux-gnu/4.0.4/../../../../include/c++/4.0.4/istream:184: note:                 std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(long int&) [with _CharT 
= char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i486-linux-gnu/4.0.4/../../../../include/c++/4.0.4/istream:187: note:                 std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(long unsigned int&) [wit
h _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i486-linux-gnu/4.0.4/../../../../include/c++/4.0.4/istream:191: note:                 std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(long long int&) [with _C
harT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i486-linux-gnu/4.0.4/../../../../include/c++/4.0.4/istream:194: note:                 std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(long long unsigned int&)
 [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i486-linux-gnu/4.0.4/../../../../include/c++/4.0.4/istream:198: note:                 std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(float&) [with _CharT = c
har, _Traits = std::char_traits<char>]
/usr/lib/gcc/i486-linux-gnu/4.0.4/../../../../include/c++/4.0.4/istream:201: note:                 std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(double&) [with _CharT = 
char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i486-linux-gnu/4.0.4/../../../../include/c++/4.0.4/istream:204: note:                 std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(long double&) [with _Cha
rT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i486-linux-gnu/4.0.4/../../../../include/c++/4.0.4/istream:207: note:                 std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(void*&) [with _CharT = c
har, _Traits = std::char_traits<char>]
/usr/lib/gcc/i486-linux-gnu/4.0.4/../../../../include/c++/4.0.4/istream:230: note:                 std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(std::basic_streambuf<_Ch
arT, _Traits>*) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i486-linux-gnu/4.0.4/../../../../include/c++/4.0.4/istream:734: note:                 std::basic_istream<char, _Traits>& std::operator>>(std::basic_istream<char, _Traits>&, signed char*) [with _T
raits = std::char_traits<char>]
/usr/lib/gcc/i486-linux-gnu/4.0.4/../../../../include/c++/4.0.4/istream:729: note:                 std::basic_istream<char, _Traits>& std::operator>>(std::basic_istream<char, _Traits>&, unsigned char*) [with 
_Traits = std::char_traits<char>]
/usr/lib/gcc/i486-linux-gnu/4.0.4/../../../../include/c++/4.0.4/istream:693: note:                 std::basic_istream<char, _Traits>& std::operator>>(std::basic_istream<char, _Traits>&, signed char&) [with _T
raits = std::char_traits<char>]
/usr/lib/gcc/i486-linux-gnu/4.0.4/../../../../include/c++/4.0.4/istream:688: note:                 std::basic_istream<char, _Traits>& std::operator>>(std::basic_istream<char, _Traits>&, unsigned char&) [with 
_Traits = std::char_traits<char>]
Das Problem ist der Parser. Der ist nicht fuzzy genug.
--Klaus Knopper

daedalus
Beiträge: 286
Registriert: 04.02.2005 17:06:16

Beitrag von daedalus » 26.07.2006 20:25:40

Ich bin mir nicht sicher, aber ein einheitliches Interface für std::vector<bool> und std::vector<alles_andere> wäre doch ganz nett... und wenn operator<< unterstützt wird, operator>> aber nicht, dann ist das IMHO mehr als seltsam (um ehrlich zu sein habe ich eine Weile gebraucht, um den Fehler zu finden, auch wenn er aus der Fehlermeldung eigentlich klar hervorgeht)
Das Problem ist der Parser. Der ist nicht fuzzy genug.
--Klaus Knopper

Antworten