[C++] Template-Spezialisierung führt zu Linkerfehlern
Verfasst: 06.10.2010, 23:06
Moin Leute,
ich habe mir Helferfunktionen geschrieben, um aus XML-Dateien mit wenig Code Daten rausziehen zu können. Ein typisches XML-File sieht so aus:
Um sowas einfach zu lesen, habe ich unter Anderem folgende Funktionen erfunden.
Man beachte das "inline" vor der spezialisierten Template-Funktion. Warum ist das nötig? Templates müssen doch immer im Header implementiert werden. Ich meine... ich hab's jetzt gelöst, aber ich versteh's nicht. Kann da jemand ein Licht drauf werfen?
ich habe mir Helferfunktionen geschrieben, um aus XML-Dateien mit wenig Code Daten rausziehen zu können. Ein typisches XML-File sieht so aus:
Code: Alles auswählen
<Objekt>
<Dings name="bla" id="5" />
<Blubb wert="7.2" />
</Objekt>
Code: Alles auswählen
/// Liest das benannte Attribut aus dem gegebenen Element und gibt dessen Inhalt als gewünschten Typ zurück
template <typename Typ>
Typ LiesAttribut( const TiXmlElement* pElm, const char* pAttrName)
{
const char* attr = pElm->Attribute( pAttrName);
if( !attr)
WirfAusnahme( boost::str( boost::format( "Attribut \"%s\" erwartet in Element \"%s\".") % pAttrName % pElm->ValueStr()));
Typ erg;
try
{
erg = boost::lexical_cast<Typ>( attr);
} catch( boost::bad_lexical_cast& ex)
{
WirfAusnahme( boost::str( boost::format( "Attribut \"%s\" in Node \"%s\" konnte nicht in Zieltyp konvertiert werden - %s") % pAttrName % pElm->Value() % ex.what()));
}
return erg;
}
/// Template-Spezialisierung für std::string - braucht keine Konvertierung in Zieltyp
template <>
inline std::string LiesAttribut( const TiXmlElement* pElm, const char* pAttrName)
{
const char* attr = pElm->Attribute( pAttrName);
if( !attr)
WirfAusnahme( boost::str( boost::format( "Attribut \"%s\" erwartet in Element \"%s\".") % pAttrName % pElm->ValueStr()));
return std::string( attr);
}