Re: Why won't this template function compile?
 
Carlos Moreno wrote:
::
:: And who said that the compiler has no explicit knowledge of
:: std::vector??  I #included <vector>, where the compiler finds
:: everything that it ever may need to know about vector  (not to
:: mention the issue that, since vector is fully documented in the
:: standard, why wouldn't the compiler assume knowledge about
:: it? --- well, ok, this is an entirely separate discussion, so let's
:: say that we avoid that tangent)
::
:: The thing is, putting aside the fact that the standard says that
:: there is no match --- I don't see why it could not see that match
:: (seems obvious enough for you;  maybe it's related to the way
:: compilers are implemented?  An area which I'm 150% unfamiliar
:: with!) ...
::
:: The given type is known --- vector<int>::iterator;  an available
:: template has been given, and fully described/visible to the
:: compiler, since #include <vector> is present;  the available
:: template has a type member iterator;  this constitutes a match
:: for vector<int>::iterator  given by  vector<T>::iterator for T=int.
::
:: Why would the compiler not know, or not know that it is the
:: only match?
The problem is that the compiler cannot know that vector<int>::iterator is
different from all other vector<T>::iterator, until it has tried to
instantiate std::vector for ALL possible values of T.
What if I have:
struct MySillyType
{ };
template<>
class std::vector<MySillyType>
{
     typedef std::vector<int>::iterator   iterator;
};
Now silly_f<int>() and silly_f<MySillyType>() has the same signature. 
How is
the compiler to know? It just cannot!
Bo Persson
-- 
      [ See http://www.gotw.ca/resources/clcm.htm for info about ]
      [ comp.lang.c++.moderated.    First time posters: Do this! ]