Template-Funktion, Daten aus array a in array b kopieren



  • Hallo,
    ich habe hier folgendes Beispiel-Programm, was die Daten aus array a in array b kopiert.
    D.h. als Ausgabe erhält man dann hallo hallo.

    #include <iostream>
    using namespace std;
    
    int main (void)
    {
    	char a[10] = "hallo";
    	char b[10] = "du";
    
    	cout << a << endl << b << endl;
    
    	strcpy(b,a);
    
    	cout << a << endl << b << endl;
    
    	return 0;
    }
    

    Nun meine Frage: Wie kann ich dieses mit einer Template-Funktion realisieren?

    template <Class T>
    ....

    Danke
    M_arcus



  • wie meinst du das als Template Funktion?

    Schau dir mal std::copy aus algorithm an



  • template<typename T>
    void copy(T* trg, T const* src, size_t len)
    {
      while(len--)
      {
        *trg++;=*src++;
      }
    }
    
    //und dann
    
    copy(b,a,10);
    

    Ist natürlich blödsinn, weil es std::copy in der C++ Standard Library gibt, aber zur Übung ist diese Lösung OK.



  • Hallo!

    Danke für die schnellen Antworten.
    Habe es jetzt so mal ausprobiert, aber habe dann noch folgende Fehlermeldung:

    "error C2100: Zeigeroperation ungueltig
    J:\C++\1.cpp(35) : Siehe Verweis auf Instantiierung der kompilierten Funktionsvorlage 'int __cdecl std::copy(char *,char *,int)'
    Fehler beim Ausführen von cl.exe."

    Was mache ich noch falsch?

    Hier mein Programm:

    #include <iostream>
    using namespace std;
    
    template<typename T> 
    void copy(T* trg, T const* src, size_t len) 
    { 
      while(len--) 
      { 
        *trg++=*src++; 
      } 
    }
    
    int main(void)
    {
    	char a[] = "hallo";
    	char b[] = "du";
    	cout << copy (b,a,10) << endl;
    
    	return 0;
    }
    


  • wie es aussieht, hast du ein Namenskonflikt, deswegen gibt es den Namespace std. Öffne den am besten mal nicht global und es sollte gehen (oder pack deine copy Version in einen anderen Namensraum)



  • Hi,

    schieb doch Dein copy in einen eigenen Namespace

    namespace MeinCopy{
    
    template<typename T>  
    void copy(T* trg, T const* src, size_t len)  
    {  
      while(len--)  
      {  
        *trg++=*src++;  
      }  
    } 
    }
    

    Außerdem noch zwei Sachen

    char a[] = "hallo"; 
    char b[] = "du";//Hier sind nur drei Byte reserviert, Du willst aber zehn schreiben 
    
    cout << copy (b,a,10) << endl;//Da copy nichts zurückgibt, kannst Du das nicht im cout aufrufen
    

    Du gehst über die Grenzen des reservierten Speichers hinaus. Das darfst Du nicht machen.

    so:

    char a[]="Hallo";
    char b[20]="Du";
    
    copy (b, a, strlen(a)+1 ) ;//+1 für das abschließende Nullzeichen
    cout << b;
    

    grüße Con@n



  • Hallo!

    Habe es jetzt mal so probiert. Erhalte aber trotzdem leider noch die gleiche
    Fehlermeldung. Hat jemand noch eine Idee?

    Danke
    M_arcus

    #include <iostream>
    using namespace std;
    
    namespace MeinCopy{ 
    
    	template<typename T>   
    	void copy(T* trg, T const* src, size_t len)   
    	{   
    		while(len--)   
    		{   
    			*trg++=*src++;   
    		}   
    	}  
    }
    
    int main (void)
    {
    	char a[]="Hallo"; 
    	char b[20]="Du"; 
    
    	copy (b, a, strlen(a)+1 ) ;//+1 für das abschließende Nullzeichen 
    	cout << b;
    
    	return 0;
    }
    


  • MeinCopy::copy (b, a, strlen(a)+1 ) ;//+1 für das abschließende Nullzeichen



  • Jetzt funktioniert es.
    Vielen Dank
    M_arcus


Anmelden zum Antworten