Hi,
make g++ -c -o src/lib/init_hw.o src/lib/init_hw.cpp src/lib/init_hw.cpp:In member function ‘void ZEROHW::init_hw(const std::vector<std::__cxx11::basic_string<char> >&)’: src/lib/init_hw.cpp:52:69:error: use of ‘auto READCSV::read_config_files(const string&)’ before deduction of ‘auto’ 52 | auto pin_defs = read_csv.read_config_files(file_names[0]); | ^ make: *** [<eingebaut>: src/lib/init_hw.o] Fehler 1Hast du vllt die Funktion mit `auto` Rückgabetyp in einem Header nur deklariert, aber nicht definiert? `auto` geht nur, wenn der Compiler beim Aufruf auch sieht was in der Funktion zurückgegeben wird, wenn sie als auf irgendeineweise inline bzw. in der gleichen Kompiliereinheit definiert wird. Wenn die Definition in einer separaten Einiheit ist, dann musst du explizit sagen was der Rückgabetyp ist, also `std::vector<csv_values>`.
Noch ein kleiner Nachschlag dazu: auto ist eines der praktischsten Features in C++-11, aber wie immer in C++ kann/sollte man es nicht immer und überall einsetzen.
Wann man auto unbedingt einsetzen sollte:
Wenn man einen numerischen Typ von einer Funktion zurückbekommt: auto zahl = meineFunktion();Als Rückgabetyp wenn man Templates definiert (Profi-Tip: wenn Du innerhalb der ersten 5 Jahre C++ ein Template definierst, dann machst Du wahrscheinlich was falsch; Templates benutzen ist dagegen okay, gewünscht und sogar hilfreich).
Bei komplexen Operationen bei denen es nicht intuitiv ist was der Ergebnistyp ist: auto ergebnis = getMyCollection().at(42).transform(otherGadget).last();
Wan man NICHT auto einsetzen sollte:
Wenn man selbst Funktionen/Methoden deklariert, es sei denn es ist eine triviale inline-Funktion. Also alles was komplexer als "inline auto square(int a){return a*a;}" ist sollte seinen Typ explizit deklarieren. Sprich: wenn die Definition der Funktion inline im Header steht und auf eine Zeile passt, dann auto, sonst explizit.
Wenn man weiß dass mit Referenzen oder Pointern herumhantiert wird und man den Wert weitergeben oder aufheben will, dann ist es einfacher explizit zu sagen welcher nicht-Referenz-Typ es sein soll.
In der Parameterliste von Funktionen bringt es nur unverständliche Fehlermeldungen. ;-)
Vorsicht bei der Initialisierung von Member-Variablen: auto
mysize=5; ist wahrscheinlich nicht so gewollt - es erzeugt eine
int Variable, aber "size" sollte lieber size_t, ssize_t oder long
sein...
Für alle anderen Fälle gilt:
Wenn eine Ergebnis-Variable auto-Typing bekommt hilft es im Allgemeinen Verwirrung zu vermeiden, aber es gibt Ausnahmen.
Wo wir gerade bei Vereinfachungen und Hinweisen sind:
(*)Apropos Referenzen:
Konrad