Ich arbeite meinen Weg durch beschleunigtes C++ & haben ein Problem mit Ex. 10.2 Die Frage beinhaltet das Neuschreiben einer Medianfunktion aus einem vorherigen Kapitel, so dass nun der Median mit einem Vektor oder einem eingebauten Array aufgerufen werden kann. Die Median-Funktion sollte auch Container beliebiger arithmetischer Art erlauben.Fehler mit Vorlagen: keine passende Funktionsaufruf
Ich kann nicht die beiden Anrufe zu Median detaillierten unten machen - ich die Fehlermeldung
No matching function for call to 'median'
ich von einigen der Forschung zu sammeln, dass, wenn Vorlagen verwendet werden, die Art sollte zum Zeitpunkt der Kompilierung bekannt sein. Könnte dies das zugrunde liegende Problem sein? Gibt es eine Möglichkeit, den Type als Template-Argument irgendwie zu übergeben?
Hier ist mein Code so weit:
#include <iostream>
#include <vector>
#include <stdexcept>
#include <algorithm>
#include <cstddef>
using namespace std;
template <class Iterator, class Type>
Type median(Iterator begin, Iterator end)
{
vector<Type> vec(begin,end);
typedef typename vector<Type>::size_type container_sz;
container_sz size = vec.size();
if (size == 0) {
throw domain_error("median of an empty vector");
}
sort(vec.begin(), vec.end());
container_sz mid = size/2;
return size % 2 == 0 ? (vec[mid] + vec[mid - 1])/2 : vec[mid];
}
int main()
{
vector<int> grades;
for (int i = 0; i != 10; ++i){
grades.push_back(i);
}
const int int_array[] = {2, 9, 4, 6, 15};
size_t array_size = sizeof(int_array)/sizeof(*int_array);
cout << median(int_array, int_array + array_size) << endl; //error here: Semantic Issue, No matching function for call to 'median'
cout << median(grades.begin(), grades.end()) << endl; //error here: Semantic Issue, No matching function for call to 'median' "
return 0;
}
Wenn Sie C++ 11 verwenden, können Sie den Vektor mit 'Vektor Typen initialisieren = {0, 1, 2, 3, 4 , 5, 6, 7, 8, 9} 'und' auto size = vec.size(); '(dh Entfernen des typedef). Sie können 'endl' auch durch' \ n "' ersetzen, wenn Sie möchten. –
Für First-Pass-Leser profitieren, bitte markieren Sie die Zeile (einschließlich * beide *, wenn das der Fall ist), die Ihren Kompilierungsfehler verursacht, mit einem Kommentar (zB '// <== Fehler hier). Allerdings kann der Template-Parameter 'Type' nicht aus den von Ihnen ausgeführten Calls abgeleitet werden, was letztendlich das Kernproblem darstellt. Ich denke, das von der Standardbibliothek bereitgestellte Template ['iterator_traits'] (http://en.cppreference.com/w/cpp/iterator/iterator_traits) könnte eine saubere Lösung für Ihr Problem sein. – WhozCraig
Und bitte die vollständige Fehlermeldung enthalten. In der Regel wird angegeben, welche Typen im Funktionsaufruf abgeleitet werden, die Sie mit den tatsächlich erwarteten Typen vergleichen können. –