anfängerfrage zu teamplates
-
oh.... peinlich
-
ok hatte es jetzt ausprobiert aber das ist es leider nicht gewesen....
using namespace std; template<class T>error: expected constructor, destructor, or type conversion before '<' token
-
Was soll
template<class T>sein? Das kann nicht alleine stehen. Wahrscheinlich willst du danach eine Klasse oder Funktion definieren.
-
Also das da geht bei mir:
#include <iostream> using namespace std; template<class T> T doppelt(T x){ return 2*x; } int main(){ cout<<doppelt(3.14)<<'\n'; return 0; }
-
Nexus schrieb:
Was soll
template<class T>sein? Das kann nicht alleine stehen. Wahrscheinlich willst du danach eine Klasse oder Funktion definieren.
ja
#ifndef BIT_FUNKTIONEN_H #define BIT_FUNKTIONEN_H using namespace std; template<class T> pair<int,unsigned char*> varToBytearray(T var); #endif // BIT_FUNKTIONEN_H#include "Bit_Funktionen.h" using namespace std; template<class T> pair<int,unsigned char*> varToBytearray(T var){ pair<int,unsigned char*> back; back->first=sizeof(var); unsigned char ar[back->first]; for(int i=sizeof(ar)/sizeof(ar[0])-1;i>=0;i++){//geht byte für byte durch T zw=var; //zw um i bytes nach rechts verschieben for(int a=0;a<i;a++){zw=zw>>8;}; ar[sizeof(ar)/sizeof(ar[0])-1-i]=zw&0xff;//an der 0ten,1. ect stelle einfügen }; back->second=&ar; return back; };//pair<int,unsigned char*>varToBytearray(T var)die funktion soll eine variable als bytearray zurückgeben
-
ok brauche iostream.......
wieso teamplates aber in diesem header deffiniert sind kann ich mir nicht erklären
-
template <typename T> sollte für Funktionen außerhalb einer Klasse funktionieren oder?
-
uiop schrieb:
ja
Dann zeig nächstes Mal bitte gleich auf Anhieb den relevanten Code.
Inkludiere den passenden Header. Und verwende nie
using namespacein Headerdateien, da dadurch der Namensraum für alle Clients irreversibel ausgeleert wird, was ihn ziemlich überflüssig macht.#include <utility> template <typename T> std::pair<int, unsigned char*> varToByteArray(T var);Übrigens werden lokale Variablen am Ende des Blocks zerstört, danach sollten sie nicht mehr referenziert werden. STL-Container (z.B.
std::vector) würden dir die Sache erheblich erleichtern.
-
uiop schrieb:
ok brauche iostream.......
Was hat das mit deinem Problem zu tun?
uiop schrieb:
wieso teamplates aber in diesem header deffiniert sind kann ich mir nicht erklären
Es wurde dir schon gesagt, dass es "Templates" heisst. Und wenn wir schon dabei sind, kannst du auch "definieren" richtig schreiben.
Davon abgesehen habe ich auch bei dieser Aussage nicht verstanden, was du damit meinst. Streng dich bitte ein wenig an, wenn du ernsthafte Hilfe erwartest.
Edit: Ich weiss nicht, ob du das gemeint hast, aber Templates musst du vollständig im Header definieren, wenn sie über mehrere Übersetzungseinheiten hinweg benutzt werden sollen.
-
Nexus schrieb:
uiop schrieb:
ok brauche iostream.......
Was hat das mit deinem Problem zu tun?
uiop schrieb:
wieso teamplates aber in diesem header deffiniert sind kann ich mir nicht erklären
Es wurde dir schon gesagt, dass es "Templates" heisst. Und wenn wir schon dabei sind, kannst du auch "definieren" richtig schreiben.
Davon abgesehen habe ich auch bei dieser Aussage nicht verstanden, was du damit meinst. Streng dich bitte ein wenig an, wenn du ernsthafte Hilfe erwartest.
Edit: Ich weiss nicht, ob du das gemeint hast, aber Templates musst du vollständig im Header definieren, wenn sie über mehrere Übersetzungseinheiten hinweg benutzt werden sollen.
Ich vermute dass genau das sein Fehler ist, weil die Fehlermeldung kommt mir sehr bekannt vor

Falls du Deklaration und Definition trotzdem trenne willst, dann nehm für die Templatedefinition ne andere Dateiendung wie zum Beispiel .impl
Jedoch musst du dann diese in den Header inkludieren, also gerade anders rum als bei normalen Klassen zum Beispiel.Lg freeG
-
uiop schrieb:
#ifndef BIT_FUNKTIONEN_H #define BIT_FUNKTIONEN_H using namespace std; template<class T> pair<int,unsigned char*> varToBytearray(T var); #endif // BIT_FUNKTIONEN_HPfui! Das "using namespace std;" hat in einem Header nichts zu suchen.
Getrennte Übersetzung bei Templates gibt es auch nicht wirklich. Du musst entweder auch die Definition in den Header packen (das klappt auch garantiert ohne "multiple definition" Fehler) oder Du musst in Deiner Übersetzungseinheit all die Varianten für T, die dein restliches Programm benötigt, manuell über folgende Syntax erzeugen:
// cpp-file template<class T> pair<int,unsigned char*> varToBytearray(T var) { ... } // "explicit template instantiation" template pair<int,unsigned char*> varToBytearray<int>(int); template pair<int,unsigned char*> varToBytearray<double>(double); template pair<int,unsigned char*> varToBytearray<short>(short);Die letzten drei Zeilen veranlassen den Compiler, die Funktionsschablone von oben für drei Varianten (T=int, T=double, T=short) zu übersetzen.
Desweiteren würde ich dieses Design (damit meine ich jetzt das Funktionstemplate an sich) auch vermeiden. Es sieht so aus, als ob Du dynamisch Speicher anlegen willst und einen Zeiger darauf zurückgibst. Das führt besonders bei C++ schnell mal zu Speicherlecks. ein std::vector<unsigned char> wäre hier vielleicht angebrachter, oder eine Funktion, die einen Output-Iterator übergeben bekommt und die Daten über diesen einfach ablegt.
kk