std::toupper erzeugt warnung



  • std::string up("blubb");
    std::transform(up.begin(), up.end(), up.begin(), std::toupper);
    

    codewarrior meckert:

    Warning: implicit arithmethic conversion from 'int' to 'char'
    

    mache ich was falsch?



  • Naja, std::toupper erwartet einen int.
    Ein kleiner Wrapper hilft:

    char my_toupper(char c)
    {
        return static_cast<char>(std::toupper(static_cast<int>(c)));
    }
    


  • das ist doch krank, zwei standard-funktionalitäten die füreinander gemacht sind, aber nicht ohne warnung zusammen funktionieren.
    der verdammte codewarrior nervt sowieso mit seinen pingeligen warnungen.



  • gewarnter schrieb:

    das ist doch krank, zwei standard-funktionalitäten die füreinander gemacht sind, aber nicht ohne warnung zusammen funktionieren.
    der verdammte codewarrior nervt sowieso mit seinen pingeligen warnungen.

    Ne, er hat recht. Das Problem ist eher, dass die C-Funktion int erwartet.
    Das kannst Du codewarrior nicht anlasten.


  • Administrator

    Ich möchte zudem darauf hinweisen, dass du hier womöglich einen unerwarteten Fehler erhalten könntest. Du verwendest hier nämlich C-Funktionen und somit das C-Locale statt des C++-Locales. "Richtig" wäre hier sowas:

    #include <locale>
    #include <string>
    #include <algorithm>
    
    template<typename CharT>
    class ToUpper
    {
    	// Attributes //
    private:
    	std::locale m_locale;
    
    	// Constructors & Destructor //
    public:
    	ToUpper(std::locale const& local = std::locale())
    		: m_locale(local)
    	{ }
    
    	~ToUpper() { };
    
    	// Operators //
    public:
    	CharT operator ()(CharT const& c)
    	{ return std::toupper(c, m_locale); }
    };
    
    int main()
    {
    	std::string myString = "Hello";
    
    	std::transform(myString.begin(), myString.end(), myString.begin(), ToUpper<char>());
    
    	std::cout << myString << std::endl;
    
    	return 0;
    }
    

    Das ist übrigens wahrscheinlich auch der Grund wieso es Warnungen gibt. Die Funktionen sind nicht füreinander gedacht 🙂

    Grüssli



  • ok, danke. werde ich dann so machen. schade, dass man das selber machen muss. ist ja nicht wirklich dermaßen exotisch.

    Tachyon schrieb:

    Das kannst Du codewarrior nicht anlasten.

    stimmt schon, nerven tuts trotzdem, auch wenn man selber schuld ist.
    vc++ oder gcc bringen selbst in der pedantischsten einstellung bei so manchem konstrukt keine warnungen (habs in diesem fall nicht extra ausprobiert). wenn man sich so über jahre bestimmte konstruktionen angeeignet hat, und kriegt dann vom codewarrior an allen ecken auf die fresse, dann frustriert das schon ein bisschen 🙂


  • Administrator

    Ja, es ist etwas blöd, dass man sich solche Dinge immer selber zusammenbauen muss. Man hat allerdings schnell mal eine paar Standardheader für sich gebaut und kann dann diese immer wieder verwenden 😉
    Mit Boost, kann man sich hier zudem auch noch das Leben etwas vereinfachen:

    #include <boost/bind.hpp>
    
    #include <locale>
    #include <string>
    #include <iostream>
    #include <algorithm>
    
    int main()
    {
    	std::string myString = "Hello";
    
    	std::transform(myString.begin(),
    				   myString.end(),
    				   myString.begin(),
    				   boost::bind(&std::toupper<char>,
    							   _1,
    							   std::locale()));
    
    	std::cout << myString << std::endl;
    
    	return 0;
    }
    

    Der VC++ und G++ meckern überigens bei sowas auch rum, was absolut korrekt ist. Dort kann man zwar die Warnstufe runterschrauben (was nicht empfehlenswert ist), aber das wird beim CodeWarrior wohl auch gehen.
    Vielleicht hat es früher bei dir keine Warnungen gegeben, als die Compiler VC++ und G++ noch nicht ganz Standardkonform waren.

    Grüssli



  • Dravere schrieb:

    Der VC++ und G++ meckern überigens bei sowas auch rum, was absolut korrekt ist.

    vc++ 2008 in warnstufe 4 meckert bei dem code nicht. comeau online auch nicht. generell macht vc++ viele implizite konvertierungen ohne zu warnen. codewarrior sieht das nicht so locker.


Anmelden zum Antworten