The following program compiles (bar uses a default type for T, baz relies on IFTI): --- void bar(T = double)(int i) {} void baz(T)(int i, T t) {} void main() { bar(2); baz(3, "baz"); } --- But if typeof() is used instead of explicitly specifying int, neither calls to bar and baz work any longer: --- int a; void bar(T = double)(typeof(a) i) {} void baz(T)(typeof(a) i, T t) {} void main() { bar(2); // Does not compile. baz(3, "baz"); // Does not compile. } --- The respective error messages are: Error: template test.bar(T = double) does not match any function template declaration Error: template test.bar(T = double) cannot deduce template function from argument types !()(int) and Error: template test.baz(T) does not match any function template declaration Error: template test.baz(T) cannot deduce template function from argument types !()(int,string). If the template parameter is specified explicitly, however, both of the examples work again: --- int a; void bar(T = double)(typeof(a) i) {} void baz(T)(typeof(a) i, T t) {} void main() { bar!double(2); baz!string(3, "baz"); } --- DMD from Git master at b7133502.
Take a look at bug 4413 to see if this is a dupe.
(In reply to comment #1) > Take a look at bug 4413 to see if this is a dupe. I'm not sure – it's certainly not a direct duplicate, but the root cause might be the same.
*** This issue has been marked as a duplicate of issue 4413 ***