| Thread overview | |||||
|---|---|---|---|---|---|
|
July 29, 2015 Error: 'this' is only defined in non-static member functions, not main | ||||
|---|---|---|---|---|
| ||||
Hello
I have this weird error trying to achieve something simple:
module list_test;
// import wayland.util;
template Id(alias a) { alias Id = a; }
template ParentOf(alias member)
{
alias ParentOf = Id!(__traits(parent, member));
}
template wl_container_of(alias member)
{
ParentOf!(member)*
get(wl_list* ptr)
{
return cast(ParentOf!(member)*)(cast(ptrdiff_t)(ptr)-member.offsetof);
}
}
struct wl_list {
wl_list *prev;
wl_list *next;
}
struct item {
int num;
wl_list link;
this(int num) {
this.num = num;
}
}
int main (string[] args)
{
auto i1 = item(1);
auto i2 = item(2);
auto i3 = item(3);
wl_list lst;
// wl_list_init(&lst);
// wl_list_insert(&lst, &i1.link);
// wl_list_insert(&lst, &i2.link);
// wl_list_insert(&i2.link, &i3.link);
item *it = wl_container_of!(item.link).get(&i2.link); // error on this line
return 0;
}
If I change the definition of wl_container_of to:
template wl_container_of(alias member)
{
ParentOf!(member)*
wl_container_of(wl_list* ptr)
{
return cast(ParentOf!(member)*)(cast(ptrdiff_t)(ptr)-member.offsetof);
}
}
and call to:
wl_container_of!(item.link)(&i2.link);
I now get a different error:
Error: need 'this' for 'wl_container_of' of type 'pure nothrow @nogc @system item*(wl_list* ptr)'
I run dmd v2.067 on linux 64bits.
Any idea?
thanks
Rémi
| ||||
July 29, 2015 Re: Error: 'this' is only defined in non-static member functions, not main | ||||
|---|---|---|---|---|
| ||||
Posted in reply to remi thebault | On Wednesday, 29 July 2015 at 21:33:16 UTC, remi thebault wrote: > Hello > > I have this weird error trying to achieve something simple: That's far from simple. Here's a reduction: ---- template wl_container_of(alias member) { size_t get() {return member.offsetof;} } struct item { int link; } void main() { wl_container_of!(item.link).get(); /* Error: 'this' is only defined in non-static member functions, not main */ } ---- I'm not sure what's going on here, if this should or shouldn't work. The error message isn't exactly good. Slapping `static` on `get` seems to make it work: ---- static size_t get() {return member.offsetof;} ---- I guess the compiler thinks that since `item.link` is an instance member, it needs a `this`. And then `get` would need a `this` too as it's using `item.link` via `member`. When the compiler sees that there is no `this`, it errors out. An explicit `static` forces the compiler to assume no `this`. And it would error out if you actually tried to make use of it. Naively, I'd think the compiler should be able to figure that out itself. | |||
July 29, 2015 Re: Error: 'this' is only defined in non-static member functions, not main | ||||
|---|---|---|---|---|
| ||||
Posted in reply to anonymous | On Wednesday, 29 July 2015 at 22:12:38 UTC, anonymous wrote: > Slapping `static` on `get` seems to make it work: > ---- > static size_t get() {return member.offsetof;} > ---- Good slap, thanks! you solved my problem > > I guess the compiler thinks that since `item.link` is an instance member, it needs a `this`. And then `get` would need a `this` too as it's using `item.link` via `member`. When the compiler sees that there is no `this`, it errors out. > > An explicit `static` forces the compiler to assume no `this`. And it would error out if you actually tried to make use of it. > > Naively, I'd think the compiler should be able to figure that out itself. I guess that is a dmd bug. I'll fill a report in case of. | |||
Copyright © 1999-2021 by the D Language Foundation
Permalink
Reply