Bin mal wieder blind... (STL) STL-Bug?



  • So funktioniert es auch mit VS2010.

    #include <string> 
    #include <iostream> 
    #include <map> 
    
    void print_help() { 
        std::wcout << L"Hilfe:\tshutdown\t- Fährt den Server herunter\n" 
                   << L"\thelp\t- Zeigt das Hilfemenü\n"; 
    } 
    
    int main() { 
        std::map<std::wstring, void (*)()> command_table; 
        command_table.insert(std::make_pair(L"help", &print_help)); 
    	return 0;
    }
    

    Früher funktionierte dies nicht:

    void (*f)() = &print_help;
    	(*f)();
    

    Anscheiend haben Sie doch in C++0x sinnvolles hinzugefügt.



  • Ist natürlich schöner, aber dennoch: das kann doch nicht standardkonform sein? Ob man nun vor der Funktion '&' schreibt oder nicht ist bei Nicht-Elementfunktion doch AFAIK egal?! Naja, danke für den Hinweis, jetzt kann ich weitermachen! 🤡

    Edit: Dein letztes Beispiel ist doch für C++98 vollkommen konform? Es funktionier auf jeden Fall in VS 2008, auch wenn man doch lieber das schreiben sollte:

    void (*f)() = print_help;
    f();
    


  • Und das funktioniert leider auch nicht:

    command_table[L"help"] = &print_help;
    


  • *hust* doch tut es 😮 Zeig mal Code oder/und Fehlermeldung 😛



  • Probiers doch mal so:

    typedef void(*funcPtr)();
    
    std::map<std::wstring, funcPtr> command_table;
    
    command_table.insert(std::make_pair(L"help", &print_help)); // & ist notwendig
    
    command_table[L"help"]();
    

    Getestet in VS 2010.



  • Nochmal eine kurze Nachfrage...
    Wofür steht das L vor dem "Test" String?
    Weiß nämlich nicht, wie ich mir eine Antwort ergooglen könnte ^^



  • Newbie19 schrieb:

    Nochmal eine kurze Nachfrage...
    Wofür steht das L vor dem "Test" String?
    Weiß nämlich nicht, wie ich mir eine Antwort ergooglen könnte ^^

    Eine Zeichenkette mit dem Präfix L, wie etwa

    L"help"
    

    ist eine Zeichenkette von WideChars. Ihr Typ ist

    const wchar_t[]
    


  • Ad aCTa schrieb:

    I[...]Ob man nun vor der Funktion '&' schreibt oder nicht ist bei Nicht-Elementfunktion doch AFAIK egal[...]

    Nein, ist es nicht. Wie bei allen Dingen für die man eine Referenz haben will, muss man auch bei Funktionen den Referenzoperator davor schreiben.



  • Es ist ein Adressoperator, den man auch weglassen kann.

    Wie wäre es denn mit function Objekten?



  • > Nein, ist es nicht. Wie bei allen Dingen für die man eine Referenz haben will, muss man auch bei Funktionen den Referenzoperator davor schreiben.

    Ich will ja keine Referenz, sondern einen Zeiger. Und Funktionen bilden da eigentlich eine Ausnahme, wo man den Adress-Operator nicht angeben muss. In meinen anderen VS 2008-Implementierungen habe ich es auch so gemacht, und ich glaube mich zu erinnern, dass in "Die C++ Programmiersprache" ein ähnliches Beispiel zu finden war. Oder ich habe da noch eine gewaltige Wissenslücke gehabt. 😃

    Auf jeden Fall danke für die Hilfe!


  • Mod

    Ad aCTa schrieb:

    Oder ich habe da noch eine gewaltige Wissenslücke gehabt.

    Nein, so wie Arrayausdrücke beim kleinsten Anzeichen von Gefahr in einen Zeiger umgewandelt werden, werden (lvalue-)Funktionsausdrücke ebenso implizit in Funktionszeiger umgewandelt wenn nötig (4.3). Zusätzlich wird - was hier bei make_pair eine Rolle spielt - eine Funktionsargument als Funktionszeiger deduziert (14.8.2.1/2 2. Alt).


Anmelden zum Antworten