utab <umut.tabak@[EMAIL PROTECTED]
> wrote in news:50129083-18fd-4099-9ba7-
586bb9df72e2@[EMAIL PROTECTED]
> Dear all,
>
> I was experimenting with a template taking two iterators for the range
> of
> a vector.(Perhaps, it is sth simple and I am missing it because it is
> a
> late hour.) I ran into problems in the compile phase , the code is
> below:
>
> #include <iostream>
> #include <algorithm>
> #include <stdexcept>
> #include <vector>
>
> using std::domain_error;
> using std::sort;
> using std::vector;
>
> template <class T, class Ran>
> T median(Ran b, Ran e)
> {
You are passing in only Ran arguments, there is no way the compiler could
deduce the T template parameter.
> typedef typename vector<T>::size_type vec_sz;
>
> vec_sz size = (e-b)/sizeof(T);
> if (size == 0)
> throw domain_error("median of an empty vector");
>
> sort(b, e);
>
> vec_sz mid = size/2;
>
> return size % 2 == 0 ? (b[mid] + b[mid-1]) / 2 : b[mid];
> }
>
> int main()
> {
> vector<double> vec;
> for(int i=0;i!=10;++i)
> vec.push_back(i);
> std::cout << median(vec.begin(), vec.end()) << std::endl;
... so you have to specify it yourself:
std::cout << median<double>(vec.begin(), vec.end()) << std::endl;
... or throw away the redundant template parameter:
template <class Ran>
typename Ran::value_type median(Ran b, Ran e)
{
typedef typename vector<Ran::value_type>::size_type vec_sz;
vec_sz size = (e-b)/sizeof(Ran::value_type);
if (size == 0)
throw domain_error("median of an empty vector");
....
hth
Paavo


|