Thread overview | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
February 22, 2012 Adding overloaded methods | ||||
---|---|---|---|---|
| ||||
I'm working on a project where I'm using overloaded virtual methods, and I've run into a challenge with overload sets. My code looks something like this: class Base { void get(ubyte b) {}; } class Derived: Base { //alias Base.get get; void get(string s) {}; } I've tried using an alias declaration to combine the two classes' overload sets in the derived class, but DMD complains that the alias conflicts with get(string). Is there some reasonably elegant way around this, or is it a limitation of the language? |
February 22, 2012 Re: Adding overloaded methods | ||||
---|---|---|---|---|
| ||||
Posted in reply to BLM | On Wednesday, February 22, 2012 02:21:43 BLM wrote: > I'm working on a project where I'm using overloaded virtual methods, and I've run into a challenge with overload sets. > > My code looks something like this: > > class Base { > void get(ubyte b) {}; > } > > class Derived: Base { > //alias Base.get get; > void get(string s) {}; > } > > I've tried using an alias declaration to combine the two classes' overload sets in the derived class, but DMD complains that the alias conflicts with get(string). Is there some reasonably elegant way around this, or is it a limitation of the language? Hmm. That's how you're _supposed_ to do it. Sounds like a bug. http://dlang.org/function.html It may be related to the fact that you don't have override on the derived class's get though. You're really supposed to, but it hasn't been promoted to an error yet (it's enabled with -w until it is). Try that and see if it fixes it. - Jonathan M Davis |
February 22, 2012 Re: Adding overloaded methods | ||||
---|---|---|---|---|
| ||||
Posted in reply to Jonathan M Davis | I tried using override and it complained that the functions weren't overriding anything. I think that the main problem is that the alias solution was designed to allow derived classes to use overloads that had already been defined in the base class, not for the derived classes to add _new_ overloads. This might be good material for an enhancement request. |
February 22, 2012 Re: Adding overloaded methods | ||||
---|---|---|---|---|
| ||||
Posted in reply to BLM | On Wednesday, February 22, 2012 02:50:41 BLM wrote:
> I tried using override and it complained that the functions weren't overriding anything. I think that the main problem is that the alias solution was designed to allow derived classes to use overloads that had already been defined in the base class, not for the derived classes to add _new_ overloads. This might be good material for an enhancement request.
I'd advise reporting it as a bug rather than an enhancement request. The whole point of using the alias is to bring all of the base class' overloads into the derived class' overload set. It shouldn't matter whether the derived class is adding overloads or just overriding a subset of the base class' overloads.
If the compiler devs really think that it's an enhancement request, then they can change it, but it definitely looks like a bug to me.
- Jonathan M Davis
|
February 22, 2012 Re: Adding overloaded methods | ||||
---|---|---|---|---|
| ||||
Posted in reply to BLM | On 02/21/2012 06:21 PM, BLM wrote:
> I'm working on a project where I'm using overloaded virtual methods, and I've
> run into a challenge with overload sets.
>
> My code looks something like this:
>
> class Base {
> void get(ubyte b) {};
> }
>
> class Derived: Base {
> //alias Base.get get;
> void get(string s) {};
> }
>
> I've tried using an alias declaration to combine the two classes' overload
> sets in the derived class, but DMD complains that the alias conflicts with
> get(string). Is there some reasonably elegant way around this, or is it a
> limitation of the language?
Your code actually works with dmd 2.058:
import std.stdio;
class Base {
void get(ubyte b) {
writeln("get(ubyte)");
}
}
class Derived: Base {
alias Base.get get;
void get(string s) {
writeln("get(string)");
}
}
void main()
{
ubyte b;
string s;
auto o = new Derived();
o.get(b);
o.get(s);
}
Outputs:
get(ubyte)
get(string)
I have also corrected the indentation ;) and two extraneous semicolons.
Ali
|
February 22, 2012 Re: Adding overloaded methods | ||||
---|---|---|---|---|
| ||||
Posted in reply to Jonathan M Davis | I've submitted it to the DMD developers. Hopefully it won't take too long to get fixed; it looks like it would be a _fairly_ simple fix to make. (Since when is a compiler fix simple?) |
February 22, 2012 Re: Adding overloaded methods | ||||
---|---|---|---|---|
| ||||
Posted in reply to Ali Çehreli | Hmm... I guess I'll have to figure out why my code is behaving differently and put a test case together. Strange... Thanks for fixing the semicolons. Old C++ habits die hard, even if one has written very little C++ :) |
February 22, 2012 Re: Adding overloaded methods | ||||
---|---|---|---|---|
| ||||
Posted in reply to Jonathan M Davis | On 2012-02-22 03:39, Jonathan M Davis wrote: > On Wednesday, February 22, 2012 02:21:43 BLM wrote: >> I'm working on a project where I'm using overloaded virtual methods, and >> I've run into a challenge with overload sets. >> >> My code looks something like this: >> >> class Base { >> void get(ubyte b) {}; >> } >> >> class Derived: Base { >> //alias Base.get get; >> void get(string s) {}; >> } >> >> I've tried using an alias declaration to combine the two classes' overload >> sets in the derived class, but DMD complains that the alias conflicts with >> get(string). Is there some reasonably elegant way around this, or is it a >> limitation of the language? > > Hmm. That's how you're _supposed_ to do it. Sounds like a bug. > > http://dlang.org/function.html > > It may be related to the fact that you don't have override on the derived > class's get though. You're really supposed to, but it hasn't been promoted to > an error yet (it's enabled with -w until it is). Try that and see if it fixes > it. > > - Jonathan M Davis He is overloading, not overriding. You have to start notice the difference when reading these posts :) -- /Jacob Carlborg |
February 22, 2012 Re: Adding overloaded methods | ||||
---|---|---|---|---|
| ||||
Posted in reply to Jacob Carlborg | On Wednesday, February 22, 2012 08:19:09 Jacob Carlborg wrote:
> He is overloading, not overriding. You have to start notice the difference when reading these posts :)
Well, it's both. He's overriding a base class function with a different signature. So, depending on how the compiler treats that, it could be considered either both an override and an overload or just an overload. And apparently the override attribute only applies to exact overloads.
- Jonathan M Davis
|
February 23, 2012 Re: Adding overloaded methods | ||||
---|---|---|---|---|
| ||||
Posted in reply to Jonathan M Davis | After messing around for a while, I figured out what is making DMD choke on my file. The methods were defined in the base class using template mixins, and apparently DMD doesn't like it when mixins, inheritance, overloading, and aliases are all in the same piece of code :) |
Copyright © 1999-2021 by the D Language Foundation