‘class std::vector<bool>’ has no member named ‘emplace_back’
-
Vergiss es. Erinnerte mich dunkel daran, dass
STD_VECTOR_BOOL_NOT_SPECIALfunktioniert, aber das ist ja doch nicht im Standard.Frage mich, wieso eigentlich.
Edit, @SeppJ: Der GCC bspw. erlaubt das AFAICS nicht.
-
-
vector<fool> schrieb:
Ich habe das in Templates und es wäre sehr verwirrend dem Benutzer zu verbieten, bool einzusetzen. Und per Template bool mit char zu ersetzen geht leider nicht.
evtl.
template <typename T, typename... Args> void emplace_back(T&& c, Args&&... args) { c.emplace_back(std::forward<Args>(args)...); } template <typename A, typename Arg> void emplace_back(std::vector<bool, A>& c, Arg&& arg) { c.push_back(std::forward<Arg>(arg)); } template <typename A> void emplace_back(std::vector<bool, A>& c) { c.push_back(false); }Edit: nochmal korrigiert, für den Fall das Argument kein bool ist (dann würde sonst das allgemeine Template verwendet werden).
-
camper schrieb:
vector<fool> schrieb:
Ich habe das in Templates und es wäre sehr verwirrend dem Benutzer zu verbieten, bool einzusetzen. Und per Template bool mit char zu ersetzen geht leider nicht.
evtl.
template <typename T, typename... Args> void emplace_back(T&& c, Args&&... args) { c.emplace_back(std::forward<Args>(args)...); } template <typename A> void emplace_back(std::vector<bool, A>& c, bool b = false) { c.push_back(b); }Super, darauf wär ich nicht gekommen. Das ist besser als meine ganzen Hacks, die ich mir überlegt habe.
-
Ich dachte, du darfst die Syntax nicht ändern. So ist es natürlich etwas anderes.
@camper: Wieso für das erste (allgemeine) Funktionstemplate Temporaries erlauben?
volkard schrieb:
Arcoth schrieb:
Edit, @SeppJ: Der GCC bspw. erlaubt das AFAICS nicht.
Hä?
Was ist daran unverständlich?
Edit: Die Spezialisierung vonvectorliegt im Header<bits/stl_bvector.h>, und die wird in<vector>bedingungslos eingebunden. Es gibt auch keine#if(n)defs, welche da irgendetwas ausschließen.
-
Jetzt reichts, ich schreibe mir einen true_vector ohne diese dummen Spässe
Lebe damit! vector<bool> und deren Probleme sind lange bekannt und werden genauso wie auto_ptr nicht aus der Bibliothek herausgenommen.
Loesung: Benutze std::bitset oder boost::dynamic_bitset!
-
knivil schrieb:
Loesung: Benutze std::bitset oder boost::dynamic_bitset!
Welches vector<bool>-Problem wird denn von bitset gelöst, außer dass bitset nicht vorgaukelt, ein vector zu sein? (Abgesehen davon, dass der TE die Ersetzung umgekehrt möchte)
-
außer dass bitset nicht vorgaukelt, ein vector zu sein?
bitset gaukelt nicht vor, ein vector zu sein.

-
vector<fool> schrieb:
Und per Template bool mit char zu ersetzen geht leider nicht.
Hm??
std::conditional<std::is_same<T,bool>::value, char, T>::type
-
ScottZhang schrieb:
std::conditional<std::is_same<T,bool>::value, char, T>::typeNicht so knorke:
template<class T> class MyClass{ //... T& operator[](std::size_t i){ return elements[i]; } private: std::vector<typename std::conditional<std::is_same<T,bool>::value, char, T>::type> elements; };
-
Und der überladene Operator gibt dann wieder eine Referenz auf
boolzurück?
Falls tatsächlich das auslagern von
emplace_back(und anderen relevanten Funktionalitäten) in spezialisierbare Einheiten nicht möglich ist, gibt es nochtemplate<typename T> using Vector = std::vector< typename std::conditional<std::is_same<T,bool>::value, char, T>::type >;
-
Die eigentliche Frage ist doch, wieso bietet vector<bool> kein emplace_back an?
-
but why schrieb:
Die eigentliche Frage ist doch, wieso bietet vector<bool> kein emplace_back an?
wieder ein ballmer peak?
-
volkard schrieb:
but why schrieb:
Die eigentliche Frage ist doch, wieso bietet vector<bool> kein emplace_back an?
wieder ein ballmer peak?
Nein, sie haben Herr Bebel vor kurzem entlassen - habt ihr das nicht mitbekommen?
Es dachten die Experten vom Komitee, dass ein
emplace_backfürvector<bool>prinzipiell unnötig ist (Perfect Forwarding ist fürboolja tatsächlich Überflüssig).
-
Arcoth schrieb:
volkard schrieb:
but why schrieb:
Die eigentliche Frage ist doch, wieso bietet vector<bool> kein emplace_back an?
wieder ein ballmer peak?
Nein, sie haben Herr Bebel vor kurzem entlassen - habt ihr das nicht mitbekommen?
Es dachten die Experten vom Komitee, dass ein
emplace_backfürvector<bool>prinzipiell unnötig ist (Perfect Forwarding ist fürboolja tatsächlich Überflüssig).Naja, das Statement ist immernoch besser als der ganze Code, den Du nüchtern produzierst.
-
Die Spezialisierung radikal auskommentieren in der STL! Ohne wenn und aber, hier wird kurzer Prozess gemacht! Und dann dynamic_bitset hernehmen, um den ganzen boost-Firlefanz erleichtern, namespace anpassen und in den STL-Ordner schieben! Problem gelöst!
-
volkard schrieb:
Naja, das Statement ist immernoch besser als der ganze Code, den Du nüchtern produzierst.
video meliora proboque, deteriora sequor.

Edit:
Die Spezialisierung radikal auskommentieren in der STL! Ohne wenn und aber, hier wird kurzer Prozess gemacht!
Ja, das ist eine Möglichkeit. Bloß nicht, dass dann aber merkwürdige Fehler in anderen Stellen anderer Header kommen.
-
In welchen genau, ich hab's jetzt noch nicht probiert? Ich denke die Menge an zerstörtem Code, global gesehen, würde sich in überschaubarem Rahmen halten, aber ist nur so eine Vermutung. Und derjenige, der den Code geschrieben hat, hat's ja auch verdient... Wenn ich nen bitset haben will, dann nehme ich auch eins.
Wenn man den "Tag des vector<bool>" einführt, könnte man zudem auf die Problematik hinweisen.
-
Arcoth schrieb:
Und der überladene Operator gibt dann wieder eine Referenz auf
boolzurück?
du hast mehr oder weniger verstandn warum ich geschrieben hab: "nicht so knorke" aka: "Löst das Problem nicht" aka "verschiebt das Problem nur ein Ebene höher"
-
mal nicht so unkreativ, die Rede war von austauschen
template<class T> class MyClass{ typedef typename std::conditional<std::is_same<T,bool>::value, char, T>::type value_type; //... value_type& operator[](std::size_t i){ return elements[i]; } private: std::vector<value_type> elements; };