Fehler beim Aufruf von Template Klassen-Funktion



  • Hi zusammen!

    Ich habe beim Aufruf per

    int iarray[7] = {7, 5, 4, 3, 9, 8, 6};
    derdss.bubble(iarray, 7);
    

    diesen Fehler

    undefined reference to `void MWSalgo::bubble<int>(int*, int)'|
    

    Wurde das Template "Version" vom Bubblesort falsch als Klassen Funktion geschrieben? -> Wie müsste es sonst aussehen?

    Danke

    MWSalgo.h

    class MWSalgo{
    public:
        MWSalgo();
        ~MWSalgo();
    
        template <class X> void bubble(X *items,int counter);
    

    MWSalgo.cpp

    template <class X> void MWSalgo::bubble(X *items,int counter) {
         X t;
    
      for(int a=1; a<counter; a++)
        for(int b=counter-1; b>=a; b--)
          if(items[b-1] > items[b]) {
            t = items[b-1];
            items[b-1] = items[b];
            items[b] = t;
          }
    }
    


  • Du hast hier einen Linker-Fehler, weil das Template in der falschen Datei implementiert ist. Es gehört in die Header-Datei.

    Ansonsten ist pointer+länge C-Stil (ohne ++). Übergib, wie in der STL üblich, begin+end-Iteratoren.

    Siehe auch https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#Ri-array



  • wob schrieb:

    Du hast hier einen Linker-Fehler, weil das Template in der falschen Datei implementiert ist. Es gehört in die Header-Datei.

    Ansonsten ist pointer+länge C-Stil (ohne ++). Übergib, wie in der STL üblich, begin+end-Iteratoren.

    Siehe auch https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#Ri-array

    Danke.

    Ich bin davon ausgegangen, dass man Deklarationen in die Header und die Implementation in die c bzw cpp datei gehört

    Ich habe nur Template Versionen von dem angesprochenen Algorithmus in C gefunden.

    Wie wäre es sonst in C+? 😕



  • noname1234 schrieb:

    Ich habe nur Template Versionen von dem angesprochenen Algorithmus in C gefunden.

    Wie wäre es sonst in C+? 😕

    Wie wäre es mit dem Versuch das Ganze selbst zu schreiben?

    Der Funktionskopf könnte z.B. so aussehen:

    template<typename iterator>
    void bubble(iterator begin, iterator end);
    

Anmelden zum Antworten