//----
template bar(T)
{
void bar(){} //Non template
void bar(U)(U u){} //Template
}
template foo1()
{
void foo1()(){} //Template
void foo1(U)(U u){} //Template
}
template foo2()
{
void foo2(){} //Non template
void foo2(U)(U u){} //Template
}
void main()
{
bar!int(); //OK
bar!int(1); //OK
foo1(); //OK
foo1(1); //OK
foo2(); //OK
foo2(1); //NOPE!
}
//----
Results in:
//----
Error: template main.foo2 does not match any function template declaration. Candidates are:
main.foo2()()
Error: template main.foo2()() cannot deduce template function from argument types !()(int)
//----
I think this is not correct behavior. "bar" and "foo2" should have the same behavior. It *seems* like the compiler does not "see" foo2().foo2(U)(U u)
The workaround (as seen in foo1), is to make the non-template function a parameter-less template.
Comment #1 by robert.schadek — 2024-12-13T18:15:02Z