Bug 2499 – Template alias default value cannot be template instantiation

Status
RESOLVED
Resolution
FIXED
Severity
normal
Priority
P2
Component
dmd
Product
D
Version
D2
Platform
x86
OS
Windows
Creation time
2008-12-08T15:44:00Z
Last change time
2015-06-09T01:20:16Z
Keywords
rejects-valid
Assigned to
bugzilla
Creator
schveiguy

Comments

Comment #0 by schveiguy — 2008-12-08T15:44:00Z
Simple case: void foo(T)() { } struct f(alias func=foo!(int)) { } void main() { f!() myf; } Error in 1.036: Error: foo!(int) is not a symbol Error in 2.019: testtemplatealias.d(5): Error: foo!(int) is used as a type testtemplatealias.d(11): template instance f!() does not match template declaration f(alias func = foo!(int)) testtemplatealias.d(11): Error: f!() is used as a type testtemplatealias.d(11): variable testtemplatealias.main.myf voids have no value Workaround is to alias the default parameter before using as the default parameter: alias foo!(int) defaultFoo; struct f(alias func=defaultFoo) { }
Comment #1 by schveiguy — 2008-12-08T15:47:45Z
Note that in the case where you want the default value to depend on other template parameters, such as: struct f(T, alias func=foo!(T)) This is much tricker. I found that the cleanest way to workaround is to avoid default parameters, and just alias the less specific ones: struct f(T, alias func) { } template f(T) { alias f!(T, foo!(T)) f; }
Comment #2 by bugzilla — 2008-12-25T04:39:37Z
Fixed dmd 1.038 amd 2.022