> 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. 



Reply via email to