‘class std::vector<bool>’ has no member named ‘emplace_back’
-
int main() { std::vector<int> v; v.emplace_back(); std::vector<bool> w; w.emplace_back(); }In function ‘int main()’: error: ‘class std::vector<bool>’ has no member named ‘emplace_back’ w.emplace_back(); ^Kein Kommentar

Jetzt reichts, ich schreibe mir einen true_vector ohne diese dummen Spässe. Gibts da schon was fertiges?
-
vector<fool> schrieb:
Gibts da schon was fertiges?
Ja, vector<char>

-
Gibts da schon was fertiges?
Wie wäre es, wenn du einfach die explizite Spezialisierung durch das entsprechende Makro unterbindest?
-
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.
Arcoth schrieb:
Gibts da schon was fertiges?
Wie wäre es, wenn du einfach die explizite Spezialisierung durch das entsprechende Makro unterbindest?

-
vector<fool> schrieb:
Arcoth schrieb:
Gibts da schon was fertiges?
Wie wäre es, wenn du einfach die explizite Spezialisierung durch das entsprechende Makro unterbindest?

Manche Implementierungen erlauben es, das Verhalten von vector<bool> zu ändern.
Und per Template bool mit char zu ersetzen geht leider nicht.
Spezialisierung der betroffenen Teile?
-
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.