> 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.
You're right, I forgot that rather trivial example. But what I'm trying to
achieve is the correct resolution when we don't have the function's
parameters, as when we get the address of the function. Right now I have the
c++ standard here, and in section 13.1 (over.over, or "Address of overloaded
function"), the paragraph 4 says:
"If more than one function is selected, any function template
specializations in the set are eliminated if the
set also contains a non-template function, and any given function template
specialization F1 is eliminated if
the set contains a second function template specialization whose function
template is more specialized than
the function template of F1 according to the partial ordering rules of
14.5.5.2. After such eliminations, if
any, there shall remain exactly one selected function."
If I understand this correctly, when we have the following declarations:
template <class T> void foo() {}
void foo() {}
The overload set for "&foo" at first contains all "void foo<T>()" and "void
foo()". Then, because of the presence of the latter, the former should be
eliminated. In the end, only "void foo()" remains, and we have no ambiguity.
> This problem can be also reduced to this one:
> ==========
> void foo() { }
> void foo(int) { }
>
> int main()
> {
> &foo;
> }
> ==========
This is different because there's no function template involved.
Regards,
Rodolfo Lima.