Code mit inline Funktionen linken nicht
-
Die Template Funktion minValue und maxValue im Code ganz unten wird nicht gefunden:
template <class T> inline T maxValue(T value1, T value2); template <class T> inline T minValue(T value1, T value2); namespace ArraysFunctions { template <class T> T maxValue(T * Array, size_t iArraySize); template <class T> T minValue(T * Array, size_t iArraySize); template <class T> T minValue(const vector<T> & Array); template <class T> T maxValue(const vector<T> & Array); template <class T> void GetMinMaxValue(T * Array, size_t iArraySize, T & min, T & max); } template <class T> inline T maxValue(T value1, T value2) { return std::max(value1, value2); } template <class T> inline T ArraysFunctions::maxValue(T * Array, size_t iArraySize) { T max = -std::numeric_limits<T>::max(); for (int i=0; i < iArraySize; i++) { max = maxValue(max, Array[i]); } return max; } template <class T> inline T ArraysFunctions::maxValue(const vector<T> Array) { return *( std::max_element( Array.begin(), Array.end() ) ); } template <class T> inline void ArraysFunctions::GetMinMaxValue(T * Array, size_t iArraySize, T & min, T & max) { min = std::numeric_limits<T>::max(); max = -std::numeric_limits<T>::max(); for (size_t i=0; i < iArraySize; i++) { min = minValue(min, Array[i]); max = maxValue(max, Array[i]); } }Die Fehlermeldung ist:
In file included from QSpectrogramData.h:16,
from QSpectrogramPlot.cpp:3:
..\include/arrayfunctions.h: In function 'void ArraysFunctions::GetMinMaxValue(T*, size_t, T&, T&) [with T = double]':
QSpectrogramData.h:89: instantiated from here
..\include/arrayfunctions.h:122: error: no matching function for call to 'minValue(double&, double&)'
..\include/arrayfunctions.h:123: error: no matching function for call to 'maxValue(double&, double&)'Warum kennt nun der Compiler 'maxValue(double&, double&)' nicht, obwohl ich es oben im Code stehen habe?
-
Lass mal die Inlinerei weg, die erledigt dein Compiler viel besser für dich.
Siehe http://www.c-plusplus.net/forum/viewtopic-var-t-is-105893.html und http://www.gotw.ca/gotw/033.htm
-
und außerdem erzeugst du imho undefiniertes verhalten:
T max = -std::numeric_limits<T>::max();
was spricht gegenmin()?
das die standard bibliothek so was schon hat, ist dir klar und du machst das hier nur zu übungszwecken, oder?
bb
-
Michael E. schrieb:
Lass mal die Inlinerei weg, die erledigt dein Compiler viel besser für dich.
gut, aber auch ohne ein einziges 'inline' bleibt der Fehler derselbe.
-
Würde mich etwas wundern, aber versuch mal min=::minValue etc.
Und noch was: oben heißt es maxValue(const vector<T> & Array), unten aber maxValue(const vector<T> Array).
-
Visual Studio bringt hier sogar eine sehr genaue Fehlermeldung:
error C2244: 'ArraysFunctions::maxValue': Keine Übereinstimmung für Funktionsdefinition mit vorhandener Deklaration gefunden
-
pospiech schrieb:
Warum kennt nun der Compiler 'maxValue(double&, double&)' nicht, obwohl ich es oben im Code stehen habe?
Weil die Templates, die du brauchst, nicht im Namensraum ArraysFunctions stehen, und die Deklarationen gleichen Namens in ArraysFunctions die Templates im äußeren Namensraum verdecken.
Falls Überladen werden soll, muss das im gleichen Namensraum passieren oder die Funktionen per ADNL auffindbar sein.