digitalmars.D.learn - Mixin template function
- cal (22/22) Feb 13 2013 Should the following work?
- cal (24/24) Feb 13 2013 And a related question:
- monarch_dodra (8/33) Feb 13 2013 This looks like it comes from C++, and is a built-in protection.
- Jacob Carlborg (10/34) Feb 13 2013 The base class and the subclass have different overload sets. You need
- monarch_dodra (3/25) Feb 13 2013 AFAIK, this is a bug. It has *probably* already been reported,
- Jacob Carlborg (9/31) Feb 13 2013 This is by design. Foo and A have different overload sets. Try:
- cal (3/9) Feb 13 2013 Ahh this is what I was missing, many thanks.
Should the following work? import std.traits; mixin template Foo() { void foo(T)(T t) if (isSomeString!T) {} } class A { void foo()(int i){} mixin Foo; } void main() { auto a = new A; a.foo("hello"); } Error: template hello.A.foo does not match any function template declaration. Candidates are: hello.A.foo()(int i) If i give the mixin an identifier (mixin Foo _foo) and call it like a._foo.foo("hello") then it works. I thought it should work without that though.
Feb 13 2013
And a related question: class A { void foo(int i){} void foo(Tuple!(int) i){} } class B: A { override void foo(int i){} } int main() { auto b = new B; b.foo(tuple(5)); } This fails to compile. Why can't B use A's tuple overload of foo()? If I do this: class B: A { override void foo(int i){} void foo(Tuple!(int) i){} // no override keyword is deprecated } The compiler warns about not using the override keyword, so it must be seeing the function?
Feb 13 2013
On Thursday, 14 February 2013 at 05:49:33 UTC, cal wrote:And a related question: class A { void foo(int i){} void foo(Tuple!(int) i){} } class B: A { override void foo(int i){} } int main() { auto b = new B; b.foo(tuple(5)); } This fails to compile. Why can't B use A's tuple overload of foo()? If I do this: class B: A { override void foo(int i){} void foo(Tuple!(int) i){} // no override keyword is deprecated } The compiler warns about not using the override keyword, so it must be seeing the function?This looks like it comes from C++, and is a built-in protection. If you override a single method, it will shadow all other overloads. This makes sure you don't accidentally call something you didn't want over-ridden. If you know what you are doing, then you can make it explicit. C++ uses the "using" keyword. I don't know how D does it. http://stackoverflow.com/questions/888235/overriding-a-bases-overloaded-function-in-c
Feb 13 2013
On 2013-02-14 06:49, cal wrote:And a related question: class A { void foo(int i){} void foo(Tuple!(int) i){} } class B: A { override void foo(int i){} } int main() { auto b = new B; b.foo(tuple(5)); } This fails to compile. Why can't B use A's tuple overload of foo()? If I do this: class B: A { override void foo(int i){} void foo(Tuple!(int) i){} // no override keyword is deprecated } The compiler warns about not using the override keyword, so it must be seeing the function?The base class and the subclass have different overload sets. You need to bring in "foo" from the base class into the overload set in the subclass. You can do this by using an alias: class B : A { alias A.foo foo; } -- /Jacob Carlborg
Feb 13 2013
On Thursday, 14 February 2013 at 00:29:51 UTC, cal wrote:Should the following work? import std.traits; mixin template Foo() { void foo(T)(T t) if (isSomeString!T) {} } class A { void foo()(int i){} mixin Foo; } void main() { auto a = new A; a.foo("hello"); } Error: template hello.A.foo does not match any function template declaration. Candidates are: hello.A.foo()(int i) If i give the mixin an identifier (mixin Foo _foo) and call it like a._foo.foo("hello") then it works. I thought it should work without that though.AFAIK, this is a bug. It has *probably* already been reported, but you'd have to check for it.
Feb 13 2013
On 2013-02-14 01:29, cal wrote:Should the following work? import std.traits; mixin template Foo() { void foo(T)(T t) if (isSomeString!T) {} } class A { void foo()(int i){} mixin Foo; } void main() { auto a = new A; a.foo("hello"); } Error: template hello.A.foo does not match any function template declaration. Candidates are: hello.A.foo()(int i) If i give the mixin an identifier (mixin Foo _foo) and call it like a._foo.foo("hello") then it works. I thought it should work without that though.This is by design. Foo and A have different overload sets. Try: alias Foo.foo foo; http://dlang.org/template-mixin.html Search for: "Mixin Scope" and pay attention to: "Alias declarations can be used to overload together functions declared in different mixins". -- /Jacob Carlborg
Feb 13 2013
On Thursday, 14 February 2013 at 07:40:58 UTC, Jacob Carlborg wrote:This is by design. Foo and A have different overload sets. Try: alias Foo.foo foo; http://dlang.org/template-mixin.html Search for: "Mixin Scope" and pay attention to: "Alias declarations can be used to overload together functions declared in different mixins".Ahh this is what I was missing, many thanks.
Feb 13 2013