[C/C++] Fehler bei der Benutzung von Templates

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von JoE THE, 5. März 2009 .

  1. 5. März 2009
    Fehler bei der Benutzung von Templates

    Hallo Zusammen

    Habe mal wieder ein C++ programm geschrieben, doch ich habe - glaube ich - irgendwo einen kleinen Fehler und finde ihn nicht. Kann mir jemand auf die Sprücnge helfen?

    Code:
    //============================================================================
    // Name : 0203.cpp
    // Author : 
    // Description : Circular Buffer
    //============================================================================
    
    #include <iostream>
    #include "0203.h"
    using namespace std;
    
    CircularBuffer::CircularBuffer(int index) {
     next = index;
     for(int i=0;i<20;i++) {
     A[i] = 1; <- Linie 13 bzw 14 wäre hier
     }
    }
    
    void CircularBuffer::add(T value) {
     int i=0;
     while(i<20) {
     if(A[i]==" ")
     A[i]=value;
     else
     i++;
     }
     if(i==20) 
     A[0]=value;
    }
    
    T CircularBuffer::find(T value) {
     int i=0;
     while(i<20&&A[i]!=value)
     i++;
     if(A[i]==value)
     cout << "An der Stelle " << i << " ist der Wert " << value << " vorhanden.";
     else
     cout << "Der Wert " << value << " ist im Buffer nicht enthalten.";
    }
    
    void CircularBuffer::print() {
     for(int i=0;i<20;i++) {
     cout << "Die Werte im Buffer betragen: " << A[i];
     }
    }
    
    
    int main() {
     CircularBuffer<int> buffer;
     
     buffer.print();
     
     return 0;
    }
    

    und das header File

    Code:
    //============================================================================
    // Name : 0203.h
    // Author : 
    // Description : Circular Buffer
    //============================================================================
    
    #include <iostream>
    
    template<typename T>
    class CircularBuffer {
     public:
     CircularBuffer(int next);
     void add(T value);
     T find(T value);
     void print();
     T A[20];
    
     private:
     int next;
    };
    Builder Output:

    mfg
    joe The
     
  2. 5. März 2009
    AW: Fehler bei der Benutzung von Templates

    verwendest du den gcc? soweit ich mich erinnern kann benötigt der das schlüsselwort template vor entsprechenden aufrufen! du musst also dem compiler direkt sagen dass es sich hier um ein template handelt dort wo du auch auf eines zugreifst!

    genaue syntax weiß ich leider echt nicht mehr, ist gut 3 jahre aus dass wir das durchgekaut haben

    mit dem visual studio compiler sollte das problem übrigens nicht auftreten!
     
  3. 9. März 2009
    AW: Fehler bei der Benutzung von Templates

    Kleiner Tipp am Rande: Templates macht man am besten Header-only, also Code gleich mit in die Definition packen.

    Bitte schön:
    Code:
    template<typename T>
    class CircularBuffer {
     private:
     int next;
     public:
     T A[20];
     CircularBuffer(int index)
     {
     next = index;
     for(int i=0;i<20;i++) {
     A[i] = 1; 
     }
     }
    
     void add(T value)
     {
     int i=0;
     while(i<20) {
     if(A[i]==" ")
     A[i]=value;
     else
     i++;
     }
     if(i==20) 
     A[0]=value;
     }
    
     T find(T value)
     {
     int i=0;
     while(i<20&&A[i]!=value)
     i++;
     if(A[i]==value)
     cout << "An der Stelle " << i << " ist der Wert " << value << " vorhanden.";
     else
     cout << "Der Wert " << value << " ist im Buffer nicht enthalten.";
    
     return value;
     }
    
     void print()
     {
     for(int i=0;i<20;i++) {
     cout << "Die Werte im Buffer betragen: " << A[i];
     }
     }
    };
    Kompiliert ohne Probleme unter MSVC++...
    Du musst in der Main() auch die Klasse anders Deklarieren:

    CircularBuffer<int> buffer(HIER_MUSS_NOCH_EIN_WERT_REIN);

    Du hast nämlich keinen Konstruktor, der keine Werte entgegennimmt...

    mfg r90
     
  4. 9. März 2009
    AW: Fehler bei der Benutzung von Templates

    Oooder wahlweise für die, unteranderem ich auch, es nicht passt direkt Inline zu definieren, include den Sourcecode am Ende vom Header:

    Code:
    #ifndef ..
    ...
    template<class T>
    class Abrakadabra
    {
    ...
    } /* class Abrakadabra */;
    
    #include "Abrakadabra.inl" // oder .c, aber bei sowas ist es wohl auffälliger wenn die datei mit dem Suffix .inl endet 
    ...
    #endif
     
  5. 25. März 2009
    AW: Fehler bei der Benutzung von Templates

    wenn A nur ein mal == " " ist, hast dann eine fette endlosschleife xD

    Code:
    while(i<20) {
     if(A[i]==" ")
     A[i]=value;
     else
     i++;
     }
     
  6. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.