2016-12-26 1 views
2

다음은이 example입니다. 내가 컴파일 할 때, 그것은 오류 반환 : I 클래스비 정적 멤버 함수 C++의 잘못된 사용

class Machine 
{ 
    class State *current; 
    public: 
    Machine(); 
    void setCurrent(State *s) 
    { 
     current = s; 
    } 
    static void on(); // I add static here ... 
    static void off(); // and here 
}; 

에서 void on();static을 추가하려고

void(Machine:: *ptrs[])() = 
    { 
    Machine::off, Machine::on 
    }; 

라인에

Invalid use of non-static member function

를하지만 불평

Invalid use of member Machine::current in static member function

이 문제를 해결하도록 도와 줄 수 있습니까?

답변

5

정적 멤버 함수 또는 자유 함수와 달리 비 정적 멤버 함수는 멤버 함수 포인터에 implicitly convert이 없습니다.

(강조 광산)

An lvalue of function type T can be implicitly converted to a prvalue pointer to that function. This does not apply to non-static member functions because lvalues that refer to non-static member functions do not exist.

그래서 당신은 비 정적 멤버 함수의 주소를 취할 명시 적으로 &를 사용해야합니다 (즉, 비 정적 멤버 함수 포인터를 얻을 수 있습니다). 예 :

void(Machine:: *ptrs[])() = 
    { 
    &Machine::off, &Machine::on 
    }; 

가 그들에게 정적 멤버 함수를 선언하는 경우 (비 멤버 함수 포인터 배열) ptrs의 형식을 변경한다. 정적 멤버 함수의 경우에는 &을 명시 적으로 사용하지 않는 것이 좋습니다. 예 :

void(*ptrs[])() = 
    { 
    Machine::off, Machine::on 
    }; 
+0

Ah, oui. 그것은 효과가 있지만 왜 설명해 주시겠습니까? 감사합니다 – GAVD

+0

@GAVD 설명이 추가되었습니다. – songyuanyao

+0

@songyuanyao pcap 라이브러리의 pcap_loop()도 비슷한 오류를 발생시킵니다. 이걸 보시고 당신이 어떤 생각을 갖고 있는지 알려주시겠습니까? Tqvm http://stackoverflow.com/questions/43108998/c-pcap-loop-arguments-issue – Wei

관련 문제