Hallo!
Heute bin ich auf ein interessantes C+±Phänomen unter Microsoft Visual Studio 2008 gestoßen.
Kurze Erklärung des Falles:
Ich habe mehrere Aufrufe einer Methode namens ReadValue für verschiedene Typen. Da die Verwaltung von mehreren Methoden & eine Kodeverlängerung unerwünscht sind, habe ich eine Vorgabe-Methode (sprich template) implementiert.
Die Methode hat den Aufruf
template
bool ReadValue(const LPCTSTR szName, T &nValue, const T nDefValue);
und verwendet wie man sieht call by reference.
Das Problem:
Heute musste ich feststellen, dass die Methode zwar brav die Werte einliest, den Wert aber über den Übergabeparameter nValue nicht zurückgibt. Als ich die sechs normalen Methoden ReadValue für die unterschiedlichen Typen (BYTE, float, int, UINT, WORD, …) hinzufügte & die Vorlagenmethode ReadValue auskommentierte, ging alles wie erwünscht: Der Wert wurde zurückgegeben.
Frage:
Was mache ich falsch?
Hier der Kode im Detail:
// ---------------------------------------------------------------------------------------------------------------
// Base functionality of getting a number from the data file.
// Parameters:
// szName : String of the name to be searched in the data file.
// nValue : Value to be returned
// nDefault: Value to be taken, if the nValue does not exist in the data file.
// Returns whether the reading was successful of not.
// 20100213 SAE
// ---------------------------------------------------------------------------------------------------------------
template
bool CPSDatFile::ReadValue(const LPCTSTR szName, T &nValue, const T nDefault)
{
bool bValueRead = false;
stlString strBuffer;if(ReadValue(szName, strBuffer, „“))
{
nValue = (T)_tstof(strBuffer.c_str());
bValueRead = true;
}
else
{
nValue = nDefault;
}return bValueRead;
}