Warnung bei std::numeric_limits<T>::max();



  • template <class T>
    inline T maxArrayValue(T * Array, int iArraySize)
    {
    	T max = -std::numeric_limits<T>::max(); 
    	for (int i=0; i < iArraySize; i++)
    	{			
    		max = maxValue(max, Array[i]);
    	}
    	return max;
    }
    

    liefert mir die Warnung

    warning C4003: Nicht genügend übergebene Parameter für das Makro 'max'

    Warum?



  • du musst

    #define NOMINMAX
    

    vor

    #include <windows.h>
    

    schreiben



  • wozu "windows.h", wenn dann

    #include<limits>
    

    bei welchem Ausdruck liefert er dir den Fehler?
    generell wuerde ich dir hier aber strengstens zu std::vectoren und Vewendung der STL Algorithmen raten!



  • windows.h wird bei mir von einer externen libary geladen. Und natürlich steht bei mir #include <limits>



  • pospiech schrieb:

    windows.h wird bei mir von einer externen libary geladen. Und natürlich steht bei mir #include <limits>

    Dann musst du es halt vor die Includes der externen Library schreiben.



  • also für nen std::vector würde das ganez so aussehen:

    #include <vector>
    #include <algorithm>
    int main()
    {
       std::vector<int> vec;
       vec.push_back(1);
       vec.push_back(111);
       vec.push_back(51);
    
       std::vector<int>::iterator pos = std::max_element( vec.begin(), vec.end() );
       int max = *pos;
       std::cout<< max <<std::endl; //->111
    }
    

    aber wenn du etwas mehr quelltext offenbarst, kann dir bei deiner Version sicher geholfen werden!!! Von welchem Type ist den T?



  • Wenn ich mir das hier http://cboard.cprogramming.com/showthread.php?t=49579 anschaue, liegt es wohl nicht am Quellcode, sondern an Makros die mit meinem Code überhaupt nichts zu tun haben.



  • also im MSVC ist min leider global definiert udn funktioniert auch OHNE std:: davor. das ist nicht std-konform und kann mit

    #define NOMINMAX
    

    deaktiviert werden.
    dein Macro funktioniert bei mir so anstandslos:

    #include <limits>
    
    template <class T> 
    inline T maxArrayValue(T const* const&  Array, const int& iArraySize) 
    { 
       T max = -std::numeric_limits<T>::max(); 
       for (int i=0; i < iArraySize; i++) 
       {            
          max = std::max(max, Array[i]); 
       } 
       return max; 
    }
    


  • pospiech scheint ziemlich dumm zu sein. Da gibt man ihm die richtige Antwort und er ignoriert sie einfach.



  • muffmolch schrieb:

    also im MSVC ist min leider global definiert udn funktioniert auch OHNE std:: davor. das ist nicht std-konform und kann mit

    #define NOMINMAX
    

    deaktiviert werden.
    dein Macro funktioniert bei mir so anstandslos:

    MSVC selber definiert ja nichts. Höchstens die .h Dateien die man lädt und das ist bei mir "windows.h" innerhalb von 'win_qextserialport.h' was eine externe Bibliothek ist.

    Wenn ich nun in dieser .h Datei das #define NOMINMAX schreibe, dann funktioniert es auch. Hat also mit meinem eigenen Code nichts zu tun.

    Und was soll das mich als dumm hinzustellen, ich habe nirgendswo geschrieben, dass es mit dem definieren von NOMINMAX nicht gehen würde!



  • [quote="pospiech"]

    muffmolch schrieb:

    MSVC selber definiert ja nichts. Höchstens die .h Dateien die man lädt und das ist bei mir "windows.h" innerhalb von 'win_qextserialport.h' was eine externe Bibliothek ist.

    Klar das wird so ziemlicha lles definiert und zwar durch jeden Include eines std-Headers. Das Studio selbst nicht (ausser wenn du Std-Defnies angegeben hast in deiner IDE). Ich wollte nur damit sagen, dass es eben zu dem von dir beschriebenen Verhalten kommen kann, wenn du mit dem MSVC entwicklest und dessen Header-Dateien verwendest. Irgendwo wird dabei jeweils ein macro "min" und "max" gesetzt, was sich dann mit deinen min-max beisst.

    hier der betreffende Abschnitt in windef.h, die durch windows.h eingebunden wird (~line 187):

    #ifndef NOMINMAX
    
    #ifndef max
    #define max(a,b)            (((a) > (b)) ? (a) : (b))
    #endif
    
    #ifndef min
    #define min(a,b)            (((a) < (b)) ? (a) : (b))
    #endif
    
    #endif  /* NOMINMAX */
    

    nicht schön!!! denn es sollte eher so aussehen (und sieht es letztlich ja auch...):

    namespace std
    {
       template< typename T >
       inline const T& min(const T& a1,const T& a2) 
       { 
          return (a1<a2) ? a1 : a2;
       }
    }
    


  • Ich glaube das Missverständnis liegt darin dass ich zwar Visual Studio als Editor verwende aber keine einzige C++ Bibliothek/Header Datei von Visual Studio, sondern mit Qt arbeite. Daher lädt auch keine meiner eigenen Dateien direkt oder indirekt irgentwo windows.h. Würde ich mit MFC arbeiten wäre das natürlich anders.



  • ja, das kann sein. Das Problem trat bei mir auch bei Qt das erste Mal auf. witzig... Trolltech benutzt z.B. in der Network-Lib windows-spezifische Header. Aber wie gesagt: füge NOMINAX einfach zu den Präprozessor Definitionen und das Problem ist gelöst!


Anmelden zum Antworten