Nicht nachvollziehbare Compiler-Fehlermeldung



  • Hallo Leute, ich habe seit neuestem in diesem codepart:

    #include <cmath>
    ...
    // hier ist die Zeile 42 und 43
    template <class T> inline T max(T x, T y) { return x>y ? x : y;}
    template <class T> inline T min(T x, T y) { return x<y ? x : y;}
    

    eine Fehlermeldung die ich nicht nachvollziehen kann.

    2>c:\util.h(42): error C2027: use of undefined type 'T'
    2>c:\util.h(42): error C2226: syntax error : unexpected type 'T'
    2>c:\util.h(42): error C2146: syntax error : missing ')' before identifier 'y'
    2>c:\util.h(42): error C2146: syntax error : missing ';' before identifier 'y'
    2>c:\util.h(42): error C2059: syntax error : ')'
    2>c:\util.h(42): error C2059: syntax error : ')'
    2>c:\util.h(43): error C2027: use of undefined type 'T'
    2>c:\util.h(43): error C2226: syntax error : unexpected type 'T'
    2>c:\util.h(43): error C2146: syntax error : missing ')' before identifier 'y'
    2>c:\util.h(43): error C2146: syntax error : missing ';' before identifier 'y'
    2>c:\util.h(43): error C2059: syntax error : ')'
    2>c:\util.h(43): error C2059: syntax error : ')'
    

    Ich binde diese Header Datei in fast allen anderen Dateien ein.



  • Der von dir gezeige Codeausschnitt funktioniert bei mir. Eventuell liegt es an den Funktionsnamen. Es gibt in der STL bereits Funktionen namens min und max.



  • kjljkl schrieb:

    Der von dir gezeige Codeausschnitt funktioniert bei mir. Eventuell liegt es an den Funktionsnamen. Es gibt in der STL bereits Funktionen namens min und max.

    Tatsächlich. Es hat sich mit <algorithm> gebissen. Dennoch ein nicht nachvollziehbare Beschreibung. Danke für den Tipp.



  • Deshalb gibt es ja auch den Namespace std. Das dauernde using namespace std; macht das natürlich zu nichte.



  • Ich sehe gerade, dass es sich bei deinem Codeausschnitt um eine Headerdatei handelt. In einer Headerdatei gehören absolut GAR KEINE using-Direktiven. Das ist das schlimmste was man machen kann. In Headern daher immer std:: ausschreiben. Ansonsten wird bei jedem Inkludiere die using-Direktive erneut ausgeführt und der Sinn von Namespaces ist damit gänzlich hinüber, da der Namespace überall "aufgehoben" wurde.



  • Ja, nie using declarations mit file scope in einer Header Datei. Aber mit local lcope sind using declarations in Ordnung, auch in einem Header, nicht?



  • icarus2 schrieb:

    Ja, nie using declarations mit file scope in einer Header Datei. Aber mit local lcope sind using declarations in Ordnung, auch in einem Header, nicht?

    Was meinst du?



  • kjljkl schrieb:

    icarus2 schrieb:

    Ja, nie using declarations mit file scope in einer Header Datei. Aber mit local lcope sind using declarations in Ordnung, auch in einem Header, nicht?

    Was meinst du?

    Du kannst ja auch z.B. innerhalb einer Funktion using declaratiosn brauchen. Die sind haben dann local scope. Und die müssten in einem Header ja trotzdem gehen. (Gut, um ehrlich zu sein... brauchen tut mans nicht wirklich ^^).


  • Mod

    Lokale usings in Headern sind durchaus ok, wenn man es nötig hat. Merkt ja niemand anderes. Aber wenn man gleich ein using namespace std; reinhaut anstatt using std::... dann sollte man auch tunlichst vermeiden, Bezeichner aus der Standardbibliothek zu benutzen. Man weiß ja nicht, welche Header vor dem eigenen eingebunden werden.



  • VS2010 schrieb:

    kjljkl schrieb:

    Der von dir gezeige Codeausschnitt funktioniert bei mir. Eventuell liegt es an den Funktionsnamen. Es gibt in der STL bereits Funktionen namens min und max.

    Tatsächlich. Es hat sich mit <algorithm> gebissen. Dennoch ein nicht nachvollziehbare Beschreibung. Danke für den Tipp.

    Dann hast du schief geguckt. Das beisst sich nicht mit <algorithm> sondern mit <windows.h>, und zwar weil da "min" und "max" als #defines drinstehen.

    Mach ein #undef min #undef max davor und du hast Ruhe.
    (Oder auch ein #define NOMINMAX vor das #include <windows.h>)


Log in to reply