Array von std::string mit std::array<> Probleme



  • Hi zusammen,

    ich übe mich gerade in C++ (MinGW -> GCC 4.6.2, CodeBlocks) und habe ein Problem. Ich möchte gerne eine Array von Strings erzeugen, welches die Monate eines Jahres erhält. Dieses Array versuche ich mit der in C++11 eingeführten Array-Klasse zu erzeugen. Ich habe folgendes probiert (verkürzt dargestellt).

    #include <iostream>
    #include <string>
    #include <array>
    
    int main
    {
        using std::cin;
        using std::cout;
        using std::endl;
        using std::array;
        using std::string;
    
        array<string, 2> Months = { "Januar",
                                    "Februar"};
    
        cout << Months.at(0) << endl;
        cout << Months.at(1) << endl;
    
        return 0;
    }
    

    Funktioniert auch soweit wunderbar, die passenden Namen werden angezeigt. Allerding bekomme ich folgende Warnung:

    warning: missing braces around initializer for 'std::array<std::basic_string<char>, 2u>::value_type [2] {aka std::basic_string<char>[2]}'
    

    Ich hab schon viel rumprobiert, aber mit zusätzlichen {} bekomme ich dann meist nur die Meldung, dass zu viele Initializer vorhanden sind. Kann mir jemand sagen wo ich etwas falsch gemacht habe?



  • array<string, 2> Months = {{ "Januar",
                                    "Februar"}};
    

    Richtig korrekt ist es so. Mit den äußeren Klammern sprichst du das Datenelement (ein Array) der Klasse array an, mit den inneren Klammern initialisierst du dieses Array.



  • Da du std::string mit einem const char* initialisierst, sollten um die einzelnen Strings geschweifte Klammern.



  • Gugelmoser schrieb:

    array<string, 2> Months = {{ "Januar",
                                    "Februar"}};
    

    Richtig korrekt ist es so. Mit den äußeren Klammern sprichst du das Datenelement (ein Array) der Klasse array an, mit den inneren Klammern initialisierst du dieses Array.

    Ah ok, so funktioniert es.

    Michael E. schrieb:

    Da du std::string mit einem const char* initialisierst, sollten um die einzelnen Strings geschweifte Klammern.

    Das hatte ich schon probiert, da bekomme ich den Fehler: "too many initializers for....".

    Vielen Dank für die Hilfe.

    EDIT: Eine Frage hab ich noch. Ich habe festgestellt, dass ich unabhängig vom Typ immer diese doppelte Klammersetzung von oben machen muss. In meinem C++ Primer Plus (v.6) und auch hier [url] http://www2.research.att.com/~bs/C++0xFAQ.html#std-array [/url] wird das in den Beispielen aber nicht gemacht. Ist das Compilerspezifisch?



  • Meiner schrieb:

    EDIT: Eine Frage hab ich noch. Ich habe festgestellt, dass ich unabhängig vom Typ immer diese doppelte Klammersetzung von oben machen muss. In meinem C++ Primer Plus (v.6) und auch hier [url] http://www2.research.att.com/~bs/C++0xFAQ.html#std-array [/url] wird das in den Beispielen aber nicht gemacht. Ist das Compilerspezifisch?

    Die Compiler erlauben es, der Standard glaub nicht. Natürlich ist es unabhängig von Typ. Du kannst es dir so vorstellen, dass std::array einfach ein rohes Array kapselt.

    Wie initialisierst du ein rohes Array? So:

    int ar[] = {1,2,3};
    

    Wie initialisierst du eine struct mit reiner Datenansammlung: So:

    struct Foo
    {
    	int i;
    };
    
    Foo f = {1};
    

    Und nun siehst du ja, wenn das Datenelement der Struktur ein Array ist, brauchst du eben 2x {}.



  • Ok, mit dem Struktur Beispiel hab ich das soweit verstanden. War / Bin nur irritiert, da selbst in der MSDN etwas anderes drin steht http://msdn.microsoft.com/en-us/library/bb983093.aspx .



  • Meiner schrieb:

    Ok, mit dem Struktur Beispiel hab ich das sowei verstanden. War / Bin nur irritiert, da selbst in der MSDN was anderes drin steht http://msdn.microsoft.com/en-us/library/bb983093.aspx .

    Wie gesagt, die Compiler erlauben es, weil es einfach doof ist 2x {} zu schreiben. Es ist ja bekannt, dass Informatiker faul sind. 🤡



  • Genau dass hab ich mir auch gedacht :D. Dann wäre das ja geklärt, vielen Dank für die Hilfe.



  • Falsch geklärt, es handelt sich um einen gcc-Bug.
    http://www.c-plusplus.net/forum/p2185378#2185378



  • Nexus schrieb:

    Falsch geklärt, es handelt sich um einen gcc-Bug.
    http://www.c-plusplus.net/forum/p2185378#2185378

    Ah ok, gut zu wissen, dass es standardkonform ist.


Anmelden zum Antworten