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.

Reply via email to