Ellery Newcomer wrote:
On 03/24/2010 11:40 PM, Walter Bright wrote:
Nick Sabalausky wrote:
In D1, is there any reason I should be getting an error on this?:
// module A:
enum FooA { fooA };
void bar(FooA x) {}
// module B:
import A;
enum FooB { fooB };
void bar(FooB x) {}
bar(FooB.fooB); // Error: A.bar conflicts with B.bar (WTF?)
------- a.d -------------------
enum FooA { fooA };
void bar(FooA x) {}
------- test.d ----------------
import a;
enum FooB { fooB };
void bar(FooB x) {}
void test()
{
bar(FooB.fooB);
}
------------------------------
with:
dmd test
I do not get an error with either D1 or D2. So, if you are getting an
error, how is your code different?
------- a.d -------------------
enum FooA { fooA };
void bar(FooA x) {}
------- test.d ----------------
import a;
mixin(`
enum FooB { fooB };
void bar(FooB x) {}
`);
void test()
{
bar(FooA.fooA); //error
bar(FooB.fooB);
}
------------------------------
This error is quite correct (and happens with or without the mixin). The idea is
if you define a function in a local scope, it *completely hides* functions with
the same name in imported scopes. In order to overload local functions with
imported ones, an alias is necessary to bring the imported functions into the
same scope.
This allows the user complete control over which functions get overloaded when
they come from diverse, and possibly completely independent, imports.
------- a.d -------------------
enum FooA { fooA };
void bar(FooA x) {}
------- test.d ----------------
import a;
alias a.bar bar;
mixin(`
enum FooB { fooB };
void bar(FooB x) {}
`);
void test()
{
bar(FooA.fooA);
bar(FooB.fooB); //error
}
------------------------------
I'm not sure why this error is happening, it definitely has something to do with
the mixin. Let me look into it some more.