Probleme mit Templates



  • im header



  • // Datei: quicksort.cpp
    
    # ifndef __QUICKSORT_HEADER__
    # define __QUICKSORT_HEADER__
    
    #include <vector>
    #include <iostream>
    
    using namespace std;
    
    template <class clst=double> class sortMachine {
    
    private:void swap(clst& a, clst& b) {
        double t=a;
        a=b;
        b=t;
    }
    
    private:int partition(vector <clst>& a, int s, int t) {
    
        // Funktionsweise:
        // Bsp:
        // Reihe (erstes Element=Position 0) :
        // 5,3,6,1,7,3,2 -> Pivot Elem=5
        // Schleife {
        //  1.Schritt: 3<5 -> jop, vertausche Pos 1 mit der 1. Pos
        //  2.Schritt: 6<5 -> nein, passt.
        //  3.Schritt: 1<5 -> jop, vertausche Pos 3 mit der 2. Pos
        //  4.Schritt: 7<5 -> nein, passt.
        //  5.Schritt: 3<5 -> jop, vertausche Pos 5 mit der 3. Pos
        //  6.Schritt: 2<5 -> jop, vertausche Pos 6 mit der 4. Pos
        // }
        // Nach Schleife: 5,3,1,3,2,6,7
        // Nun noch das erste Element (Pivotelement) mit dem letzten getauschten
        // Element (hier: 2) vertauschen.
        //
        // Prinzip:
        // Die Reihe wird durchgegangen. Wenn ein Element kleiner als das Pivotelement ist,
        // so wird ein Counter erhöht und das Elemnt dahin getauscht.
        // Der Counter ist also die rechte Begrenzung des ersten Sub-Arrays mit den
        // Elemnten kleiner als das Pivotelement.
    
        clst pivot=a[s];              // Pivot Elemnt = Unterstes Element
        int l = s;
        for(int i=s+1; i <= t; i++) {   // Schleife
            if (a[i] < pivot) {
                l++;                    // Counter erhöhen
                swap (a[i],a[l]);
            }
        }
        swap(a[s],a[l]);                // Vertausche erstes Element (Pivot) mit dem Element an Pos l
        return l;
    }
    
    public:void out(vector<clst>& a) {
        for(vector <clst>::iterator it = a.begin(); it != a.end(); it++) {
            cout << *(it) << " ";
        }
    }
    
    public:void createList (vector<clst>& a, int elems) {
        for (int i=1; i<=elems; i++)
            a.push_back(rand()%101);
    }
    
    public:void quicksort(vector <clst>& a, int s, int t) {
        int m;
        if (s < t) {
            m = partition(a, s, t);
            quicksort(a, s, m-1);
            quicksort(a, m+1, t);
        }
    }
    };
    # endif
    
    // Datei: main.cpp
    
    #include <iostream>
    #include <vector>
    #include <stdlib.h>
    #include <time.h>
    
    #include "quicksort.cpp"
    
    using namespace std;
    
    int main() {
        vector <double> arr(0);
        sortMachine <double> sorter;
    
        srand (time(NULL));
    
        //sorter.createList(arr,1000);
        //sorter.quicksort(arr, 0, 1000);
        //sorter.out(arr);
    
        return 0;
    }
    


  • Du faules Stück schreib im Header std davor!



  • ... schrieb:

    Du faules Stück schreib im Header std davor!

    XD würde ich machen, wenn ich wüsste was geanu du damit meinst....

    Ich soll wo genau das std platzieren? Und dann solls tun?



  • Und jetzt noch den Code rausmachen der nix mit dem Problem zu tun hat.



  • // Datei: quicksort.cpp
    # ifndef __QUICKSORT_HEADER__
    # define __QUICKSORT_HEADER__
    
    #include <vector>
    #include <iostream>
    
    using namespace std;
    
    template <class clst=double> class sortMachine {
    public:void out(vector<clst>& a) {
        for(vector<clst>::iterator it = a.begin(); it != a.end(); it++) {
            cout << *(it) << " ";
        }
    }
    };
    # endif
    
    #include <iostream>
    #include <vector>
    #include <stdlib.h>
    #include <time.h>
    
    #include "quicksort.cpp"
    
    using namespace std;
    
    int main() {
        vector <double> arr(0);
        sortMachine <double> sorter;
    
        for (int i=0; i<100; i++)
            arr.push_back(rand()%101);
    
        sorter.out(arr);
    
        return 0;
    }
    


  • Das Problem is eben, dass ich nen Fehler inder Datei quicksort.cpp bekomm, da irgendwas an dem "...vector <clst>::iterator it..." nicht passt.

    die Meldung:

    expected ';' before "it" (Line 12, quicksort.cpp)
    'it' undeclared (first use of function)

    wenn ich nun aber das clst ersetze durch z.B. double, dann tuts.....das will ich aber nicht!



  • meine eMail-Addy is:

    cocii@gmx.de

    Wenn jemand weiß wie's tut, kann er mir auch ne mail schicken....wär super nett. ^^ Sitz jetzt schon ewig an dem Problem.



  • Kleines Beispiel:

    #include <vector>
    #include <iostream>
    
    using namespace std;
    
    template< typename t = double >
    struct foo
    {
    	void bar( vector< t >& b )
    	{
    		vector< t >::iterator it = b.begin();
    		cout << *it << " ";
    	}
    };
    
    int main()
    {
    	vector< int > a;
    	a.push_back( 1 );
    	foo< int > b;
    	b.bar( a );
    
    	vector< double > c;
    	c.push_back( 1.2 );
    	foo<> d;
    	d.bar( c );
    }
    


  • ... schrieb:

    Kleines Beispiel:

    #include <vector>
    #include <iostream>
    
    using namespace std;
    
    template< typename t = double >
    struct foo
    {
    	void bar( vector< t >& b )
    	{
    		vector< t >::iterator it = b.begin();   //<---
    		cout << *it << " ";
    	}
    };
    
    int main()
    {
    	vector< int > a;
    	a.push_back( 1 );
    	foo< int > b;
    	b.bar( a );
    
    	vector< double > c;
    	c.push_back( 1.2 );
    	foo<> d;
    	d.bar( c );
    }
    

    Genau das geliche Problem. Tut nur, wenn ich in der Zeile die ich mit "<---" markiert hab das "< t >" durch z.b. "< int >" ersetze (gut, das beispiel rennt dann nicht, weil ich in der main funktion das ganze mal mit double aufrufe...aber sonst würds tun.).

    Kann das ne Compilereinstellungssache sein?

    Hier mal screenshot mit den fehlern....:
    http://www.itak.de/screen.jpg



  • Hab den Code mit vc71 getestet und kompiliert anstandslos. Welchen Compiler verwendest du?



  • ich benutze den GNU GCC (C++) Compiler...tut nich.... 😞

    (-> Vllt hilft der screenshot (URL siehe oben))



  • Schreib typename vor die markierte Zeile



  • steht übrigens auch in der fehlermeldung. wer lesen kann ist klar im vorteil.



  • Yey!

    es tut! ^^ Fettes merci an alle!

    Ok, das mit dem 'typename' hätt ich lesen können, stimmt.... 😉

    Aber:

    1. Warum kompiliert Vc71 das ohne typename?
    2. Was macht typename überhaupt??


Anmelden zum Antworten