Ganz simple Frage zu std::begin. :)
-
Hi,
ich nutze std::begin mit VS10. Aber jetzt muss es auch unter Linux kompilieren. Leider bekomme ich diese Fehler: http://ideone.com/vdXbq
Fehlt da ein Header oder so? Ich stehe gerade auf dem Schlauch, aber für Leute die Linux nutzen, sollte die Frage eigentlich leicht zu beantworten sein. (Mit MinGW kompiliert es lustigerweise auch..)
-
Hey
So geht's bei mir:[...] for (auto i = v.begin(); i != v.end(); ++i) [...]Ich glaub dieses std::begin(TYP) ist nur VC. Die pfeifen sowieso auf viel zu viele Standards.EDIT: Vielen dank an den unteren Poster. Jetzt weiß ich wieder mehr

-
Unterstützung für std::begin/end war in gcc 4.5 noch nicht da, mit 4.6 geht es aber.
-
Athar schrieb:
Unterstützung für std::begin/end war in gcc 4.5 noch nicht da, mit 4.6 geht es aber.
Okay, ich habe so etwas schon geahnt. Oh man, warum haben die so ein einfaches Feature nicht früher eingefügt?
Wie auch immer, unter Ubuntu liefert apt-get upgrade g++ leider nichts über Version 4.5.2. Heißt das, ich müsste GCC selbst kompilieren?
-
Selbst kompilieren muss nicht sein, gibt auch ein PPA:
https://launchpad.net/~ubuntu-toolchain-r/+archive/test
-
nt0r schrieb:
Ich glaub dieses std::begin(TYP) ist nur VC. Die pfeifen sowieso auf viel zu viele Standards.Informier dich nächstes Mal besser.
-
Athar schrieb:
Selbst kompilieren muss nicht sein, gibt auch ein PPA:
https://launchpad.net/~ubuntu-toolchain-r/+archive/testSuper danke, nach etwas testen hat es dann geklappt. Für alle die das gleiche Problem haben:
sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo apt-get update
sudo apt-get upgrade g++
sudo apt-get install g++
-
cooky451 schrieb:
ich nutze std::begin
voll-qualifiziert? Ich bin mir da nicht sicher, wie man jetzt begin/end wirklich aufrufen soll. Ich würde es wahrscheinlich genauso machen wie bei swap auch: unqualifiziert, so dass ADL noch greift. Auf std::begin/end/swap kann man dann immer noch mit einer using-Deklaration zurückfallen:
template<class T> void foo(T const& x) { using std::begin; using std::end; for (auto it = begin(x), ee = end(x); it!=ee; ++it) { ... } }
-
krümelkacker schrieb:
cooky451 schrieb:
ich nutze std::begin
voll-qualifiziert? Ich bin mir da nicht sicher, wie man jetzt begin/end wirklich aufrufen soll. Ich würde es wahrscheinlich genauso machen wie bei swap auch: unqualifiziert, so dass ADL noch greift. Auf std::begin/end/swap kann man dann immer noch mit einer using-Deklaration zurückfallen:
template<class T> void foo(T const& x) { using std::begin; using std::end; for (auto it = begin(x), ee = end(x); it!=ee; ++it) { ... } }Qualifiziert dürfte gut genug genug sein - Ein Container, der ein non-member begin anders definiert als in std, dürfte ohnehin als defekt gelten. Anderseits:
6.5.4 The range-based for statement [stmt.ranged]
...
— if _RangeT is a class type, the unqualified-ids begin and end are looked up in the scope of class _RangeT
as if by class member access lookup (3.4.5), and if either (or both) finds at least one declaration, beginexpr
and end-expr are __range.begin() and __range.end(), respectively;
— otherwise, begin-expr and end-expr are begin(__range) and end(__range), respectively, where begin
and end are looked up with argument-dependent lookup (3.4.2). For the purposes of this name lookup,
namespace std is an associated namespace.Irgendwann wirds eine neue Auflage von Effective C++ geben, und was Meyers dann dazu sagt, ist dann auch Standard.
-
camper schrieb:
Qualifiziert dürfte gut genug genug sein - Ein Container, der ein non-member begin anders definiert als in std, dürfte ohnehin als defekt gelten.
Diese Form von begin(vector) wurde ja gerade deswegen eigneführt, damit es einen Standardweg gibt, um Container die kein iterator interface haben, ein solches zu spendieren(siehe zum Beispiel pre C++0x BOOST_FOREACH welches das genau so definiert hat). Dieses mit qualifizierern aushebeln zu wollen halte ich für suboptimal.
-
Hätte man das nicht als operator begin und operator end verpacken können? Die Operatoren könnte man dann einfach für alles Überladen. Und das std:: Ding wäre auch geklärt.
-
Lieber STD-Features als Sprach-Features lautet irgend so ne Designregel. Ich denke mal, dass sie da genau so gedacht haben. Zugegebenermaßen fände ich das aber auch schöner.
-
314159265358979 schrieb:
Lieber STD-Features als Sprach-Features lautet irgend so ne Designregel.
In etwa, man braucht nichts als Sprachfeature einzuführen, was sich mit Bibliotheksmitteln in ähnlicher Komplexität erreichen lässt.
cooky451 schrieb:
Hätte man das nicht als operator begin und operator end verpacken können? Die Operatoren könnte man dann einfach für alles Überladen. Und das std:: Ding wäre auch geklärt.
std::begin darfst du auch für alles spezialisieren, kein exta Sprachfeature nötig.
-
pumuckl schrieb:
std::begin darfst du auch für alles spezialisieren, kein exta Sprachfeature nötig.
Doch, das ausdrückliche Erlauben von Spezialisierungen in std (im Gegensatz zur allgemeinen Regel) kommt einem Sprachfature gleich. Also meintest du mit "exta" wohl neu?