2017-09-07 21 views
0

this이 정적 멤버 함수에서 평가되지 않은 컨텍스트에 허용되지 않습니까? 또 다른 장점은 의도가 더 분명 사실이다 (가끔 그 다음, VeryVeryLongClassName * 훨씬 더 짧은)정적 멤버 함수의 평가되지 않은 컨텍스트에서

error: 'this' is unavailable for static member functions

static_cast< decltype(this) >(self)->f(); 
         ^~~~ 

decltype(this) 간결이 필요합니다 :

struct A 
{ 
    void f() {} 
    static void callback(void * self) // passed to C function 
    { 
     static_cast< decltype(this) >(self)->f(); 
    } 
}; 

이 코드는 오류를 제공합니다.

정적 멤버 기능에서 평가되지 않은 상황에서 this을 사용하는 것에 대해 어떤 표준이 말하는가?

+0

의 가능한 복제 https://stackoverflow.com/questions/21143275/c-type-of-enclosing-class-in-static-member-function) –

답변

6

나는이 평가되지 않은 상황에서 this 나타납니다, 당신은 정적 멤버 함수에, 그래서 어떻게 컴파일러는이 맥락에서 this의 유형을 추론하도록되어 doesn't exist 뭔가 언급 한 것을 중요한 방법 표시되지 않는 이유는 무엇입니까? 멤버 함수 constT *라면 그것이 아니라면 멤버 함수, decltype(this)T const*을 수득 할 상기 추론로서

비 정적 멤버 함수의 type of this는 CV-규정에 따라 달라진다. 따라서 유형은 표현식의 컨텍스트에 따라 다릅니다. 귀하의 예에서 컨텍스트에는 this 포인터가 없습니다.

클래스의 이름을 지정하는 데 따르는 고통을 줄이려면 클래스의 별칭을 추가 할 수 있습니다.

class VeryVeryLongClassName 
{ 
    using self = VeryVeryLongClassName; 
}; 
([정적 멤버 함수 둘러싸 C++ 클래스의 종류]