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.