digitalmars.D.learn - template instance cannot use local 'f' as parameter to non-global
- Trass3r (22/22) Jul 12 2011 Is this a bug? If not, how do you make it work?
- Trass3r (1/1) Jul 13 2011 Anybody an idea?
- Stephan (2/24) Jul 13 2011 I am not sure but i am not that used to those template aliases anyway.
- Steven Schveighoffer (7/29) Jul 13 2011 I've seen this error before...
- Trass3r (6/21) Jul 13 2011 g();
- Tyro[a.c.edwards] (20/41) Jul 13 2011 Don't know it this is the right answer or a possible bug but it does the...
- Trass3r (6/25) Jul 13 2011 Thanks!
- Tyro[a.c.edwards] (28/57) Jul 13 2011 I guess the simplest example of the problem you're experiencing would be...
- Trass3r (3/6) Jul 13 2011 I think this is yet another issue.
Is this a bug? If not, how do you make it work? void h() {} class Bla { mixin wrap!h; } mixin template wrap(alias f) { void blub(alias g = f)() { } } void main() { Bla b = new Bla(); b.blub(); } test.d(18): Error: template instance cannot use local 'f' as parameter to non-global template blub(alias g = f) test.d(18): Error: template instance forward reference of f test.d(18): Error: template instance test.Bla.wrap!(h).blub!(f) error instantiating
Jul 12 2011
On 12.07.2011 15:06, Trass3r wrote:Is this a bug? If not, how do you make it work? void h() {} class Bla { mixin wrap!h; } mixin template wrap(alias f) { void blub(alias g = f)() { } } void main() { Bla b = new Bla(); b.blub(); } test.d(18): Error: template instance cannot use local 'f' as parameter to non-global template blub(alias g = f) test.d(18): Error: template instance forward reference of f test.d(18): Error: template instance test.Bla.wrap!(h).blub!(f) error instantiatingI am not sure but i am not that used to those template aliases anyway.
Jul 13 2011
On Tue, 12 Jul 2011 09:06:56 -0400, Trass3r <un known.com> wrote:Is this a bug? If not, how do you make it work? void h() {} class Bla { mixin wrap!h; } mixin template wrap(alias f) { void blub(alias g = f)() { } } void main() { Bla b = new Bla(); b.blub(); } test.d(18): Error: template instance cannot use local 'f' as parameter to non-global template blub(alias g = f) test.d(18): Error: template instance forward reference of f test.d(18): Error: template instance test.Bla.wrap!(h).blub!(f) error instantiatingI've seen this error before... *searches memory and old code* Here you go: http://d.puremagic.com/issues/show_bug.cgi?id=3051 As a workaround, is there a reason you need blub to be parameterized? I mean, f is already part of the template. -Steve
Jul 13 2011
Am 13.07.2011, 16:02 Uhr, schrieb Steven Schveighoffer <schveiguy yahoo.com>:g();void h() {} class Bla { mixin wrap!h; } mixin template wrap(alias f) { void blub(alias g = f)() {} }As a workaround, is there a reason you need blub to be parameterized? I mean, f is already part of the template.Yep, a default function is passed to wrap and in most cases blub just calls that one. But sometimes I need blub to use a function other than the default one.
Jul 13 2011
On 7/13/2011 11:35 PM, Trass3r wrote:Am 13.07.2011, 16:02 Uhr, schrieb Steven Schveighoffer <schveiguy yahoo.com>:Don't know it this is the right answer or a possible bug but it does the trick: void h() { import std.stdio; write("h()"); } class Bla { mixin wrap!h; } mixin template wrap(alias f) { void blub(typeof(&f) g = &f) { g(); } } void main() { Bla b = new Bla(); b.blub(); }g();void h() {} class Bla { mixin wrap!h; } mixin template wrap(alias f) { void blub(alias g = f)() {} }As a workaround, is there a reason you need blub to be parameterized? I mean, f is already part of the template.Yep, a default function is passed to wrap and in most cases blub just calls that one. But sometimes I need blub to use a function other than the default one.
Jul 13 2011
Am 13.07.2011, 16:58 Uhr, schrieb Tyro[a.c.edwards] <nospam home.com>:Don't know it this is the right answer or a possible bug but it does the trick: void h() { import std.stdio; write("h()"); } class Bla { mixin wrap!h; } mixin template wrap(alias f) { void blub(typeof(&f) g = &f) { g(); } } void main() { Bla b = new Bla(); b.blub(); }Thanks! Unfortunately it doesn't work with more complex functions: Error: arithmetic/string type expected for value-parameter, not cl_errcode C function(cl_program program, uint param_name, ulong param_value_size, void* param_value, ulong* param_value_size_ret)
Jul 13 2011
On 7/14/2011 12:24 AM, Trass3r wrote:Am 13.07.2011, 16:58 Uhr, schrieb Tyro[a.c.edwards] <nospam home.com>:I guess the simplest example of the problem you're experiencing would be this: void h() { import std.stdio; write("h()"); } void function() fp = &h; class Bla { mixin wrap!(fp); } mixin template wrap(alias f) { void blub() { typeof(&f) g = &f; g(); // <--- source of error [1] } } void main() { Bla b = new Bla(); b.blub(); } edit1.d(19): Error: function expected before (), not g of type void function()* [1] Here you are calling a function pointer which simply returns the address of the function... hence your error! Try calling the function pointed to by differencing the pointer as such: (*g)() and your problem is solved.Don't know it this is the right answer or a possible bug but it does the trick: void h() { import std.stdio; write("h()"); } class Bla { mixin wrap!h; } mixin template wrap(alias f) { void blub(typeof(&f) g = &f) { g(); } } void main() { Bla b = new Bla(); b.blub(); }Thanks! Unfortunately it doesn't work with more complex functions: Error: arithmetic/string type expected for value-parameter, not cl_errcode C function(cl_program program, uint param_name, ulong param_value_size, void* param_value, ulong* param_value_size_ret)
Jul 13 2011
I've seen this error before... *searches memory and old code* Here you go: http://d.puremagic.com/issues/show_bug.cgi?id=3051I think this is yet another issue. The inner template argument is not something on the stack but it is a template argument.
Jul 13 2011