2014-11-09 4 views
1

현재 일부 프로그램에서 사용할 수있는 대리자 클래스를 작성 중입니다. 느슨한 함수에 대한 내 코드가 작동하지만 멤버 함수를 바인딩하는 코드에서 컴파일러 오류가 발생합니다. 컴파일러 오류 내용은 다음과 같습니다.포인터를 통해 클래스 멤버에 액세스 할 때 "unqualified-id"컴파일러 오류가 발생했습니다.

error: expected unqualified-id before '(' token.

나는 그럴만한 이유가 없습니다. 멋지게 컴파일하는 부분을 제외하고 내 코드는 다음과 같습니다.

template <typename T> class Delegate; 

template <typename R, typename... Args> 
class Delegate<R(Args)> 
{ 
    typedef void* InstancePtr; 

//... 

    template <typename C, R (C::*classFunction)(Args...)> 
    static inline R MakeStubFunction(InstancePtr instance, Args... args) 
    { 
     // vvv error on this line vvv 
     return (static_cast<C*>(instance)->(*classFunction))(args...); 
    } 

//... 

}; 

컴파일러 오류의 원인을 누구든지 지적 할 수 있습니까? 미래에 그러한 문제를 해결할 수 있다는면에서 "무조건적인 (unqualified-id)"은 무엇을 의미합니까?

+1

"비정규 - ID가" "어떤 이름", 즉 문자 같은 의미를 괄호 같은 특수 문자가 아니라 변수 이름, 유형 이름, 기능 이름 등. – leemes

답변

5

->* 운영자 괄호를 제거하고 사용

return (static_cast<C*>(instance)->*classFunction)(args...); 
+0

호기심을 풀기 위해 (내가 원한다면) 왜 내가 사용했던 구문이 작동하지 않는지 아십니까? 그것은 유효 해야하는 것 같습니다 ... – Conduit

+0

@Conduit 당신은 객체가없는 비 정적 멤버에 대한 포인터를 "역 참조"할 수 없지만 그것은 중괄호 안에서 시도한 것입니다. – Columbo

+0

Ahhh - 함수의 실제 내용이 인스턴스에 포함 된 멤버 변수를 기반으로 변경 될 수 있기 때문에 이는 무엇입니까? – Conduit