Link Fehler

DuffCola

Mitglied
Hallo.
Ich habe eine klasse "Component" mit der Funktion:
Code:
template <class T>	bool	addProperty	(const std::string &name, T *value);
Die habe ich dann in der cpp datei definiert:
Code:
template <class T>	bool	Component::addProperty	(const std::string &name, T *value)
{
	if(properties.find(name) == properties.end())
	{
		properties[name] = value;
		return true;
	}
	else
	{
		return false;
	}
}
Jetzt bekomme ich aber einen Link Fehler, wenn ich die addProperty funktion aufrufe:
error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: bool __thiscall Component::addProperty<int>(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,int *)" (****$addProperty@H@Component@@QAE_NABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@PAH@Z)" in Funktion "_main".
Was mache ich falsch?
 
Hallo DuffCola

Darauf zielte meine Bemerkung in deinem anderen Thread ab:
Templates müssen vollständig im Header definiert werden, es ist nicht möglich diese bereits in einer C++-Datei zu kompilieren und dann später zu verwenden. Das export-Keyword wird weder von gcc noch von Visual Studio noch von sonst einem üblichen Compiler unterstützt. Es gibt einen einzigen Compiler (von der EDG), der das unterstützt.

Warum dies so ist erkennst du recht einfach, wenn du dir überlegst, wie ein Template funktioniert. Wenn du ein template-Codestück (Funktion, Klasse, Membervariable) nutzt wird (in diesem Fall) T einfach durch das ersetzt, was du geschrieben hast. Und dies ist effektiv wörtlich gemeint. Entsprechend kann der Compiler auch keinen Code generieren und später linken bis er weiss, was T sein soll.

Mögliche Lösungen:
1. Ganze Klasse im Header erstellen
2. Klasse in Header und Implementation aufteilen und die Implementation am Ende des Headers inkludieren.

Viele Grüsse
Cromon
 
Ok Danke, kannst du mir sagen, welche der 2 möglichkeiten eher genommen wird(Also ich sage mal, wenn das ein Professioneller/Erfahrener Programmiere machen würde)?
 
Das kommt ganz auf die Situation an. In deinem Fall hast du ja eine Methode, die ein Template hat. Diese ist auch nicht besonders lang, da würde ich sie einfach in den Header schreiben. Wenn du eine template-Klasse mit vielen Funktionen hast, dann würde ich die Variante 2 in Betracht ziehen.
 
Zurück