K
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_H
Pfui! 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