//---- 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.
THIS ISSUE HAS BEEN MOVED TO GITHUB https://github.com/dlang/dmd/issues/18735 DO NOT COMMENT HERE ANYMORE, NOBODY WILL SEE IT, THIS ISSUE HAS BEEN MOVED TO GITHUB