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! ]