The following code compiles and runs as expected: import std.stdio; template wyda(string pred = ``) { void wyda(int x) { writeln(pred, " ", x); } } void main() { wyda(3); wyda!("a")(4); } However, the following equivalent code does not: import std.stdio; template wyda(string pred = ``) { static if (true) void wyda(int x) { writeln(pred, " ", x); } } void main() { wyda(3); wyda!("a")(4); } The proposed solution is to get rid to the maximum extent possible of the requirements for the noisy "!()" syntax. If a template name is specified without the "!", then it should simply assume "!()" followed. Andrei
The issue here is in: template func(T) { static if (cond) void func(T x) {} } func is only a function template (onemember) when cond is true, and in the general case cond may rely on T, which relies on ifti. The following might illustrate it better: template func(T) { static if (is(T == int)) // how could we know this before performing ifti? void func(T* x) {} } The compiler cannot generally evaluate static if conditions without the template args being known. Although it could in very simple cases, I'm not sure it's worth the effort. One place I think this could be done is inside VersionConditions.
Code in this issue compiles and runs correctly on 2.075.1.