On Monday, 22 October 2018 at 12:03:22 UTC, test wrote:
On Monday, 22 October 2018 at 11:59:21 UTC, test wrote:
On Monday, 22 October 2018 at 11:42:59 UTC, test wrote:
I try made a simple example but it has no error:


I find the way to show the error:

https://run.dlang.io/is/f8cULz


import std.traits;

struct FiberS {
        static auto getThis(){
                return Fiber.getId();
        }
}

struct Proxy(T){
        T* ptr;
    alias getPayload this;

        @property ref auto getPayload() inout return {
                return * ptr ;
        }

    static auto getId(){
        return 1;
    }
}
alias Fiber = Proxy!(FiberS);


extern(C) void main(){
       auto id = Fiber.getThis(); // work here
}

struct TcpStream {
    void read(ubyte[] data){
auto id = Fiber.getThis(); // not work here in my case
    }
}

Let's analyze this call:

auto id = Fiber.getThis();

You're trying to call a static function 'getThis' on Fiber.
The type 'Fiber' is really a Proxy!FiberS. Proxy doesn't have a static getThis() function. So the compiler tries an 'alias this', which forwards to a non-static member function getPayload(). To call that function, you need an instance of 'Proxy', which you don't have. I guess the first error message ("this for getPayload needs to be type Proxy not type TcpStream") just doesn't report that clearly.

Reply via email to