‘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?


  • Mod

    vector<fool> schrieb:

    Gibts da schon was fertiges?

    Ja, vector<char> 🙂


  • Mod

    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?

    😕


  • Mod

    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?


  • Mod

    Vergiss es. Erinnerte mich dunkel daran, dass STD_VECTOR_BOOL_NOT_SPECIAL funktioniert, aber das ist ja doch nicht im Standard.

    Frage mich, wieso eigentlich.

    Edit, @SeppJ: Der GCC bspw. erlaubt das AFAICS nicht.



  • Arcoth schrieb:

    Edit, @SeppJ: Der GCC bspw. erlaubt das AFAICS nicht.

    Hä?


  • Mod

    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.


  • Mod

    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 von vector liegt 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!


  • Mod

    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>::type
    

    Nicht 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;
    };
    

  • Mod

    Und der überladene Operator gibt dann wieder eine Referenz auf bool zurück? 🤡

    Falls tatsächlich das auslagern von emplace_back (und anderen relevanten Funktionalitäten) in spezialisierbare Einheiten nicht möglich ist, gibt es noch

    template<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?


  • Mod

    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_back für vector<bool> prinzipiell unnötig ist (Perfect Forwarding ist für bool ja 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_back für vector<bool> prinzipiell unnötig ist (Perfect Forwarding ist für bool ja 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!


Anmelden zum Antworten