January 20, 2015 mixin template and overloading | ||||
|---|---|---|---|---|
| ||||
Consider:
~ % dmd -v|head -n 1
DMD64 D Compiler v2.066-devel
~% cat mixin_template_pb.d
mixin template Foo(T) {
void bar() {}
}
struct FooBar {
mixin Foo!int;
void bar(ulong d)() {}
}
void check() {
FooBar o;
o.bar();
}
~% dmd -c mixin_template_pb.d
mixin_template_pb.d(12): Error: template mixin_template_pb.FooBar.bar cannot deduce function from argument types !()(), candidates are:
mixin_template_pb.d(7): mixin_template_pb.FooBar.bar(ulong d)()
It looks like the compiler does not see the mixed-in "bar". If I comment out the definition of "bar" in "FooBar", it compiles fine. Is this to be considered a bug?
| ||||
January 20, 2015 Re: mixin template and overloading | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Luc Bourhis | On Tuesday, 20 January 2015 at 11:30:39 UTC, Luc Bourhis wrote: > Consider: > > ~ % dmd -v|head -n 1 > DMD64 D Compiler v2.066-devel > > ~% cat mixin_template_pb.d > mixin template Foo(T) { > void bar() {} > } > > struct FooBar { > mixin Foo!int; > void bar(ulong d)() {} > } > > void check() { > FooBar o; > o.bar(); > } > ~% dmd -c mixin_template_pb.d > mixin_template_pb.d(12): Error: template mixin_template_pb.FooBar.bar cannot deduce function from argument types !()(), candidates are: > mixin_template_pb.d(7): mixin_template_pb.FooBar.bar(ulong d)() > > It looks like the compiler does not see the mixed-in "bar". If I comment out the definition of "bar" in "FooBar", it compiles fine. Is this to be considered a bug? No, it's working as intended: "If the name of a declaration in a mixin is the same as a declaration in the surrounding scope, the surrounding declaration overrides the mixin one" -- http://dlang.org/template-mixin.html You can use `alias` to bring the two together: struct FooBar { mixin Foo!int f; alias bar = f.bar; void bar(ulong d)() {} } | |||
Copyright © 1999-2021 by the D Language Foundation
Permalink
Reply