Bonjour à tous.

Pourquoi le programme suivant (exercice 8-3 du livre Accelerated C++ ) ne marche pas?

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 »