I am trying to do the following:
template
std::ifstream& operator>> (std::ifstream& fin, List l)
{
T temp;
l.r
The error message means that there is no definition of ignore that the compiler can use at this point. It is exactly the same error that you get if you do:
void f() {
g();
}
void g() {}
... even if it looks very different. Note that there is no ADL issue here as the other answers say. The reason that the error message is so convoluted is because of the way that templates are processed by the compiler.
Templates are processed in two passes, during the first pass everything that is not dependent on the instantiating type must be verified without performing the type substitution, during this pass every non-dependent name must be checked, and in this case the compiler has failed to resolve ignore with the declarations available at the place of definition of the template.
If the expression depended on the type arguments to the template, it would not need to be fully resolved during the first pass and it would be tried again after type substitution, with the declarations available at the place of instantiation.