default argument funktioniert nicht - redefinition of default parameter

StehtimSchilf

Erfahrenes Mitglied
Hallo Forum

Ich versuche verzeifelt die Deklaration von meiner .cpp nach .h zu verschieben. Wenn ich dies jedoch mache, erhalte ich die Fehlermeldung: "error C2572: 'trimblaasdfasdf' : redefinition of default parameter : parameter 2"

Anbei die Definition in .cpp
Code:
std::string trimblaasdfasdf(std::string& str, const std::string& whitespaces) {
   const auto strBegin = str.find_first_not_of(whitespaces);
   if (strBegin == std::string::npos)
       return ""; // no content

   const auto strEnd = str.find_last_not_of(whitespaces);
   const auto strRange = strEnd - strBegin + 1;

   return str.substr(strBegin, strRange);
}

Anbei die Definition in .h
Code:
std::string trimblaasdfasdf(std::string& str, const std::string& whitespaces = " \t\r\n");

Wenn ich die Definition in die .cpp verschiebe, dann erhalte ich keinen Kompilerfehler. Ich verstehe jedoch nicht warum?

Ich habe keine ähnlichen Funktionen und Parameter (daher "asdfasdf"). Brauche ich für optionale Argumente noch irgendwelche spezielle inlucudes? Die include für std::string <sstream> und <iostream> habe ich selbstverständlich.


Interessant: Wenn ich in .h einfach nur diese Deklaration setze (es existiert keine Definition):
Code:
std::string schnischnaschnappiasdfasdf(int i, int a = 0);
erhalte ich ebenfalls die gleiche Fehlermeldung. Lösche ich einfach "a=0" aus der Deklaration, kompiliert sich alles. Was ist kaputt?


Ideen?
cheerioh
SiS
 
Zuletzt bearbeitet:

cwriter

Erfahrenes Mitglied
Hi

Diese Fehlermeldung kann 2 Dinge bedeuten:
1) Du hast zweimal dieselbe Funktionssignatur (also Funktionsname, Parametertypen gleich).
Ich habe keine ähnlichen Funktionen und Parameter (daher "asdfasdf").
Das also nicht. Dann bleibt
2) Du hast in der .cpp den Defaultparameter nicht entfernt.
Du sagst zwar, dass du die Deklaration verschiebst, aber offenbar hast du noch eine weitere (oder den default parameter nicht aus der Definition gelöscht).

https://msdn.microsoft.com/en-us/library/acahh3ba.aspx

Falls (wirklich, wirklich) nicht:
Was sagt der Compileroutput? Normalerweise wird auf die Konfliktzeilen hingewiesen.

Gruss
cwriter