Verwendung von Template-Funktion liefert LNK2028/LNK2019-Fehler

StehtimSchilf

Erfahrenes Mitglied
Hi Forum

ich hab mich nun durch das C++-Buch geackert und bin nun bei "Template-Funktionen" und Co. angelangt.
Beispiele in den Bücher sind ja immer schön und gut, doch m.E. etwas Praxis fern.


Ich möchte mir eine ToNumber()-Funktion schreiben:
template <typename T>

Code:
T ToNumber(std::wstring s) {

	T num = 0;
	// TODO: isNumeric()-Fkt schreiben und verwenden
	if (s.length() == 0) {
		// NaN
	} else {
		std::wistringstream ss(s);
		ss >> num;
	}
	return num;
}

Dies habe ich in eine eigenes Modul "ConversionFunctions.cpp" gepackt. Zugehörige Header-Datei "ConversionFunctions.h":
Code:
template <typename T>
T ToNumber(std::wstring s);

Kompiliere ich das ganze und führe das Prog aus, funktioniert alles wunderbar. Sobald ich jedoch irgendwo im Code dann:
Code:
int c = ToNumber<int>(TEXT("324234"));
oder
Code:
int c = ToNumber<double>(TEXT("3.1415"));
aufrufe

erhalte ich error LNK2028: unresolved token.... und error LNK2019: unresolved external symbol.

Interessanterweise hat das Ganze mal funktioniert (heisst, konnte die Funktion verwenden). Aber irgendwie nach etwas gebastel wieder nicht mehr!

Was mach ich denn nun wieder falsch?
 
Versuche mal im Header folgendes zu schreiben:

Code:
#ifndef HEADERFILE_H
#define HEADERFILE_H 

template <typename T> T ToNumber(std::wstring s);

#include "ConversionFunctions.cpp" //Definitionen abrufen

#endif

Headerfile natürlich durch den jeweiligen Namen ersetzen. Stichwort für dieses Kompilierungsmodell: Einschließende Kompilierung.


Gruß,

badday
 
Blöde Frage: in welche Header-Datei?

Ich habe:
ConversionFunction.cpp - enthält die Funktion (s.o)
ConversionFunctions.h - enthält die Definition (s.o)
TestsConsole.cpp - enthält main(), keine Header-Datei, included aber ConversionFunctions.

ich habe:
Code:
int main(array<System::String ^> ^args) {
   int bla = 0;

   // ohne die nächste Zeile lässt sich alles kompilieren.
   // wird diese jedoch aktiviert, erhalte ich die LINK-Fehler. Es liegt nicht am Text-Makro oder so...
   // int blu = ToNumber<int>(TEXT("3333"));

   return 0;
}

thx
 
Du hast bei den oben genannten nur eine Headerdatei, nämlich ConversionFunctions.h. Hier sollte das oben geschriebene rein.

Gruß,

badday
 
lol, natürlich :P

Die ConversionFunctions.cpp includierte noch die ConversionFunctions.h. Dann erhielt ich Fehlermeldungen bezgl. bereits definiert blbalbal.

Also jetzt tuts. THX!

ABER: Sowas hab ich selber nicht geschrieben und ich war mir sicher, dass ichs auch hingekriegt hab. Gibts noch ne andere Lösung für dieses problem?
 
Du meint, als du die Template-Funktion noch in der .cpp hattest, hat es noch funktioniert? Das ist natürlich der Fall, da er die Definitionen hier in einer Datei hatte.
Sowas hab ich selber nicht geschrieben und ich war mir sicher, dass ichs auch hingekriegt hab. Gibts noch ne andere Lösung für dieses problem?
Das kommt darauf an, ob du das über eine Header-Datei einbindest. Es gäbe noch das Modell der getrennten Kompilierung und dem Schlüsselwort export. Allerdings ist dies kaum verbreitet und wird von den meisten (fast allen) Compilern nicht unterstützt.

Gruß,

badday
 
Gott behüte, nein, nein, keine weiteren Kompiler-einstellungen :) Nein, ich hatte die Template-Funktion schon immer in der Header-Datei deklariert und in der .cpp deklariert und die Funktion anschliessend in einer anderen Klasse (main()) aufgerufen (Header inkludiert).

Hmmmmmm....
 
Allein die Headerdateien zu includieren dürfte aus dem Grund nicht reichen, weil der Compiler Zugang zu den Definitionen (also nicht nur zu den Deklarationen) benötigt. Dies folgt aus dem Umstand, dass eine typspezifische Version des Templates erst erstellt wird, wenn der Compiler die Benutzung mit dem jeweiligen Typen feststellt. Vielleicht hast du damals ja auch die .cpp direkt in die Datei eingebunden, die main() enthält.

Gruß,

badday
 
Zurück