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;
}