cannot appear in a constant-expression



  • Halli Hallo, wieso krieg ich @ linie 18 diesen fehler hier?
    "Approach::DoYourJob::MyStrings' cannot appear in a constant-expression"

    #include <iostream>
    #include <vector>
    
    namespace Approach
    {
        class DoYourJob
        {
            private:
            std::vector<std::string> MyStrings;
    
            public:
            void AddSomeText(std::string yourText)
            {
                MyStrings.push_back(yourText);
            }
            void PrintIt()
            {
                  std::vector < MyStrings >::iterator Itr = MyStrings.begin();
    	          for(Itr = MyStrings.begin(); Itr != MyStrings.end(); ++Itr)
    	          {
    	              std::cout << "Msg:" << *Itr;
    	          }
    
    		}
        };
    
    }
    
    int main()
    {
        using namespace Approach;
    
        DoYourJob RandomJob;
        RandomJob.AddSomeText("Hi.");
        RandomJob.PrintIt();
    
    }
    

    Compiler: minigw
    IDE: Code::Blocks

    Gruß



  • Hi,

    also so recht mag ich Dir den Code nicht glauben ... 😉
    1.) solltest Du string includen,
    2.) der iterator sollte wohl mit "std::string" und nicht mit "MyString" parametrisiert werden (würde mich aber sehr wundern, wenn das die o.g. Fehlermeldung werfen sollte) und
    3.) ich sehe weder einen expliziten noch einen "impliziten const-Anspruch".

    Bei der Gelegenheit: Deine Klasse könnte durchaus etwas const vertragen (namentlich "PrinIt()" sollte das ausgegebene Objekt nicht verändern).
    Dieser Code hier

    #include <iostream>
    #include <vector>
    #include <string>
    
    namespace Approach
    {
        class DoYourJob
        {
            private:
            std::vector<std::string> MyStrings;
    
            public:
            void AddSomeText(std::string yourText)
            {
                MyStrings.push_back(yourText);
            }
            void PrintIt()
            {
                  std::vector < std::string >::iterator Itr = MyStrings.begin();
                  for(Itr = MyStrings.begin(); Itr != MyStrings.end(); ++Itr)
                  {
                      std::cout << "Msg:" << *Itr;
                  }
    
            }
        };
    
    }
    
    int main()
    {
        using namespace Approach;
    
        DoYourJob RandomJob;
        RandomJob.AddSomeText("Hi.");
        RandomJob.PrintIt();
    
    }
    

    (den ich NICHT als gutes Beispiel angeführt verstanden möchte!)
    compiliert mit meinem xlC jedenfalls klaglos und tut auch das erwartete.

    Gruß,

    Simon2.

    Gruß,

    Simon2.



  • Hi Simon2,

    Danke für deine antwort, war wohl schon zu spät, daher so ein fehler. Ja, es sollte natürlich

    std::vector < std::string >
    

    sein und nicht

    std::vector < MyStrings >
    

    string muss ich nicht includen, dass macht schon iostream für mich.

    Darf ich fragen, wie PrintIt das Objekt verändert? Sollte es deiner meinung so aussehen?

    void PrintIt() const
            {
                  std::vector < std::string >::const_iterator Itr = MyStrings.begin();
    	          for(Itr = MyStrings.begin(); Itr != MyStrings.end(); ++Itr)
    	          {
    	              std::cout << "Msg:" << *Itr;
    	          }
    
    		}
    

    Gruß



  • confused_ schrieb:

    ...Darf ich fragen, wie PrintIt das Objekt verändert? ...

    Fragen darfst Du alles. Allerdings habe ich weder behauptet, dass PrintIt() das Objekt veränderte noch dass es das sollte. 😉

    Aber Du hast schon richtig erkannt - ich meinte das:

    confused_ schrieb:

    ...
    Sollte es deiner meinung so aussehen?

    void PrintIt() const
    ...
    

    Japp! Und das mit dem const_iterator wäre mein nächster Vorschlag gewesen. 😃

    Tut's das jetzt?

    Übrigens: Ich würde mich nicht darafu verlassen, dass iostream schon string includieren wird ... das ist IIRC nicht spezifiziert und kann in einer anderen Compilerversion schon wieder anders sein.

    Gruß,

    Simon2.



  • Simon2 schrieb:

    confused_ schrieb:

    ...Darf ich fragen, wie PrintIt das Objekt verändert? ...

    Fragen darfst Du alles. Allerdings habe ich weder behauptet, dass PrintIt() das Objekt veränderte noch dass es das sollte. 😉

    Aber Du hast schon richtig erkannt - ich meinte das:

    confused_ schrieb:

    ...
    Sollte es deiner meinung so aussehen?

    void PrintIt() const
    ...
    

    Japp! Und das mit dem const_iterator wäre mein nächster Vorschlag gewesen. 😃

    Tut's das jetzt?

    Übrigens: Ich würde mich nicht darafu verlassen, dass iostream schon string includieren wird ... das ist IIRC nicht spezifiziert und kann in einer anderen Compilerversion schon wieder anders sein.

    Gruß,

    Simon2.

    Ja, es klappt. Der fehler war halt

    std::vector < MyStrings >
    

    Aber den fehler den ich bekam hatte irgendwie kein zusammenhang mit dem code. Ok, ich werde in zukunft direkt string includieren.

    Gruß



  • confused_ schrieb:

    ...Ja, es klappt. ...

    👍 😋 👍

    Gruß,

    Simon2.



  • confused_ schrieb:

    Aber den fehler den ich bekam hatte irgendwie kein zusammenhang mit dem code.

    Doch - es sollte ein Ausdruck sein der zur Compilezeit auswertbar ist. Also ein Typbezeichner, ein Templatebezeichner oder eine integrale Konstante. MyString ist weder ein Typ noch ein Template, also versucht er, daraus einen konstanten Wert zu ermitteln, sieht aber dass es eine Variable ist und schließt messerscharf, dass eine Variable kaum in einem konstanten Ausdruck auftreten kann. Und genau darüber beschwert er sich dann auch.



  • confused_ schrieb:

    string muss ich nicht includen, dass macht schon iostream für mich.

    darauf kannste dich imho nicht verlassen und du wirst iwann mal komische fehler haben, wenn du mit strings arbeitest - weil iostream imho beispielsweise op+ nicht definiert...

    bb



  • pumuckl schrieb:

    ...

    Nooooooaaaaajooooaaaaa .... also das mag zwar im Hirn des Compilerherstellers rumgespukt sein, aber da an dieser Stelle (zumindest wenn die std::vector-Deklaration nur halbwegs so aussieht, wie ich sie mir vorstelle) ein Typ erwartet wird und von einer "Konstanten" bis dahin noch ein weiter Weg ist, fällt das für mich eher unter die Kategorie "Compiler kommt nicht weiter und meldet einfach das Erste, was ihm einfällt".

    Ich denke jedenfalls nicht, dass er mit

    std::vector<3.3f>
    

    weitergekommen wäre (obwohl da doch nichts ist, was nicht in einer "constant expression" auftauchen dürfte) .... 😉

    Kurz gesagt: "constant-expression" ist für mich irgendwie nicht dasselbe wie "zur Compilezeit feststehend".
    Aber ich kenne mich wirklich nicht in Compilerbau aus.

    Gruß,

    Simon2.


Anmelden zum Antworten