------- Comment #2 from pinskia at gcc dot gnu dot org 2006-02-02 18:47 -------
The issue here (in the source) is that the overloaded of
" result += size(*iter);" is only the size functions above that call so it
does not see the template below that call which is the function you would like
to call.
This is how standard C++ works (with the correction from DR 197).
This is a dup of bug 2922 which was fixed by rejecting invalid code and fixing
wrong code for 4.1.
The way to fix the code is to add a forward to the template function.
So the following code is the legal corrected code:
#include <algorithm>
#include <string>
#include <vector>
int size(char x) { return (int) sizeof(x); }
int size(int x) { return (int) sizeof(x); }
int size(const std::string &x) {
return (int) x.size() + (int) sizeof(int);
}
template <class T, class TT>
int size(const std::pair<T,TT> &x);
template <class T>
int size(const std::vector<T> &x) {
int result = (int) sizeof(int);
typename std::vector<T>::const_iterator iter;
for (iter = x.begin() ; iter != x.end() ; iter++)
result += size(*iter);
return result;
}
template <class T, class TT>
int size(const std::pair<T,TT> &x) {
return size(x.first) + size(x.second);
}
int foo() {
std::vector<std::pair <std::string, std::string> > pvec;
return size(pvec);
}
--------
The missing of the first template in the diangostic is just a diagnostic bug
which was reported somewhere else too, PR 16057.
*** This bug has been marked as a duplicate of 2922 ***
*** This bug has been marked as a duplicate of 2922 ***
--
pinskia at gcc dot gnu dot org changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|UNCONFIRMED |RESOLVED
Resolution| |DUPLICATE
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=26079