On Thu, 19 Jul 2007 14:45:31 -0300, Rodolfo Schulz de Lima wrote
> &print is not a call expression the same way &print<5> isn't, but 
> the latter is resolved correctly.
It's because you have specified it explicitly.
> I cannot see how a template function can be instantiated without <>, 
> since its instantiation needs the template parameters. That's why I 
> think that the compiler shouldn't even consider this situation in 
> overload resolution. With this said, in your exemple the only 
> overload for '&foo' should be 'void foo()'.
The function template `std::make_pair<>()' is an example.
You can directly call it without <>.
Since &print is not a call expression, C++ compilers cannot determine it by 
function arguments.

This problem can be also reduced to this one:
==========
void foo() { }
void foo(int) { }

int main()
{
        &foo;
}
==========

It's the same problem.
The instantiations of a function template can co-exist with non-template 
function, and they're treated as overloaded functions in C++ compilers.
In fact, the overload resolution mechanism is never performed here since 
it's not a call expression.
You can only speicify it explicitly.

Reply via email to