Problem mit STL Algorithmus Funktion aus der Standardbibliothek



  • Hallo,

    Ich bin ein blutiger Anfänger und beschäftige mich gerade mit dem Buch "Jetzt lerne ich C++" aus der Markt und Technik Reihe.
    Jedenfalls sollte ich folgenden Code zu dem Thema STL Algorithmen und Container abtippen und zum Laufen bringen.

    #include <functional>
    #include <algorithm>
    #include <conio.h>
    #include <deque>
    using namespace std;
    
    //Generator fuer ungerade Zufallszahlen
    int get_ungerade()
    {
    	int zufallszahl;
    	zufallszahl = rand() % 10000;
    	if(! (zufallszahl & 1L))
    		return zufallszahl + 1;
    	else 
    		return zufallszahl;
    }
    
    //Iterator definieren
    typedef deque<int>::iterator iter;
    
    int main()
    {
    	deque<int> container(5);
    
    	//Werte initialisieren
    	generate(container.begin(), container.end(), get_ungerade());
    
    	//Werte hinzufügen
    	container.insert(container.end(), 6, get_ungerade());
    
    	//Werte sortieren
    	stable_sort(container.begin(), container.end(), less<int>());
    
    	//Werte ausgeben
    	int count = 1;
    	for(iter i = container.begin(); i != container.end(); i++)
    	{
    		cout << count++ <<  ": " << *i << endl;
    	}
    
    	getch();
    	return 0;
    }
    

    Das Programm erstellt einen Container und füllt diesen mit 5 Zufallszahlen.
    Zusätzlich werden weitere 6 Zufallszahlen hinzugefügt (zur Veranschaulichung der Funktion container.insert()).
    Am Ende wird der Container mithilfe eines Iterators durchlaufen und die Werte werden ausgegeben.

    Beim Kompilieren tritt jedoch folgender Fehler auf.

    error C2064: Ausdruck ergibt keine Funktion, die 0 Argumente übernimmt
    

    mit Verweis auf die Funktion generate() aus der Standardbibliothek, die ich im Programm verwende.

    Ich konnte bisher keine Lösung für das Problem finden.



  • generate erwartet dort irgendetwas, dass man aufrufen kann, einenZiger auf eine Funktion oder ein Objekt mit () OPerator zum Beispiel. Du übergibst aber ein int, nämlich das Ergenis eines get_ungerade() Aufrufs. Richtig wäre ein Ziger auf die Funktion:

    generate(container.begin(), container.end(), &get_ungerade);
    // oder einfach
    generate(container.begin(), container.end(), get_ungerade);
    

  • Mod

    Und ich glaube nicht, dass container.insert(container.end(), 6, get_ungerade()); das macht, was du denkst. Das ruft get_ungerade() nämlich einmal auf und fügt dann 6x ein. Der Unterschied zwischen generate und insert sollte mit der Erklärung von brotbernd klar sein.



  • ah ok...
    habs grad ausprobiert und es funktioniert.

    Naja, so wie du es beschrieben hast stand es eigentlich auch im Buch.
    Ich hab es aber für einen Fehler gehalten und get_ungerade() geschrieben anstelle von get_ungerade, da mir diese Schreibweise von Funktionen gänzlich unbekannt war. Dazu wurde im Buch auch gar nichts geschrieben.
    Die haben es einfach ins Programm gehauen ohne dass es vorher beschrieben wurde 😡

    naja , jedenfalls Vielen Dank man 😃


Anmelden zum Antworten