Richtige Verwendung Template Definiton/Deklaration

Rene42

Erfahrenes Mitglied
Hallo miteinander,

ich verwende eine kleine Hilfsdatei, für Stringfunktionen.

Einmal habe ich den Header:

C++:
namespace RBS {

#include <string>
#include <sstream>
#include <vector>

namespace RBS {

 void ClearScreen(void);

 namespace Textservice {

  template <class T>

  //Füllt ein Zeichen mit führenden Zeichen auf, bis mindestens die Ziellänge erreicht ist
  std::string PraeFuellen(T, std::string, unsigned int);

 }

}

Und die dazu passende Codedatei:

C++:
std::string RBS::Textservice::PraeFuellen(T Eingabe, std::string Zeichen, int Laenge) {

 std::stringstream ss;
 ss << Eingabe;

 std::string Ausgabe;
 ss >> Ausgabe;

 while (Ausgabe.length() < Laenge) { Ausgabe += Zeichen; }

 return Ausgabe;

}

Will ich das ganze kompilieren, erhalte ich folgende Fehler:

In der Codedatei:
std::string RBS::Textservice::praeFuellen redeclared kind off different symbol
note: previous declaration 'template <class T> std::string RBS::Textservice::praeFuellen();

Wenn ich das richtig deute gelingt es dem Compiler nicht die Definition und Deklaration zusammenzubringen. Hat jemand eine Idee warum? Oder sehe ich das falsch?

PS: Wie unterdrücke ich den, dass gewisse Zeichenfolgen in Emojis umgesetzt werden.
 

cwriter

Erfahrenes Mitglied
Oh ja, templates.
Vor deiner Definition fehlt ein "template<class T>" (T ist sonst unbekannt), aber das ist nur ein Problem.

Templates funktionieren so, dass der Compiler durch den Code geht und bei Benutzung eines templates die generischen Parameter ersetzt und erst dann die Funktion kompiliert. Es gibt ja unendlich viele typenames / classes, da wäre ein vorkompilieren für alle Typen schlecht.
Das heisst aber, dass der Compiler immer Zugang zur Funktionsdefinition haben muss, denn sonst weiss er ja nicht, was er kompilieren soll. Daher kann die Definition nicht in einer .cpp-Datei liegen.

Also musst du die Definition in die Headerdatei schieben, und es sollte keine Konflikte mehr geben. Diese entstehen, weil es eine template-Funktion gibt, aber auch eine nicht-templatefunktion mit demselben Namen (=> "Different kind of symbol")

Gruss
cwriter
 

Rene42

Erfahrenes Mitglied
Ok. Das hatte ich zwar nicht erwartet, dass in diesem Fall alles in die Header kommt. Klingt aber logisch wie du es erklärst. Werde das heute Abend mal prüfen.

Update:
Hab es heute morgen geprüft. Tatsächlich war dies das Problem. Die ganze Definition liegt nun in der
Headerdatei und es geht.
 
Zuletzt bearbeitet: