template bon en paramètre de fonction mais pas en sortie
Bonjour à tous.
Pourquoi le programme suivant (exercice 8-3 du livre Accelerated C++ ) ne marche pas?
Code:
1 2
| Erreur à la ligne: « double result = median(begin, end); »
erreur: no matching function for call to ‘median(__gnu_cxx::__normal_iterator<double*, std::vector<double, std::allocator<double> > >&, __gnu_cxx::__normal_iterator<double*, std::vector<double, std::allocator<double> > >&)’ |
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| #include <iostream>
#include <vector>
#include <algorithm>
#include <stdexcept>
using namespace std;
template <class It, class T>
T median(It begin, It end) {
if (begin == end)
throw domain_error("median of an empty container");
sort(begin, end);
--end;
while (*begin < *end) {
++begin;
--end;
}
return begin != end ? (*begin + *end) / 2 : *begin;
}
int main() {
vector<double> numbers;
numbers.push_back(1);
numbers.push_back(3);
numbers.push_back(4);
numbers.push_back(5);
numbers.push_back(2);
numbers.push_back(6);
vector<double>::iterator begin = numbers.begin();
vector<double>::iterator end = numbers.end();
double result = median(begin, end);
cout << result << endl;
return 0;
} |
Ça fonctionne en supprimant « , class T » et en remplaçant T par double, mais je perds la templétisation du renvoie de la fonction.
Je pensais que la compilation de median avec un type de sortie double se ferait lorsque la ligne « double result = ... » serait vu.
Même en écrivant la fonction median à part dans un *.h (comme recommandé ici), le problème persiste.
Message édité pour remplacer « exercice 8-1 » par « exercice 8-3 »