2011-08-19 2 views
2

코드 :오류 : 상황에 맞는 유형 정보와 오버로드 된 함수의 주소

class que { 
public: 
    que operator++(int) {} // 1 
    que &operator++() {} 
    que &operator+=(int n) { 
     que& (que::*go)(); 
     go = 0; if(n > 0) go = &que::operator++ ; // 2 
     //go = (n > 0) ? (&que::operator++) : 0 ; // 3 
    } 
}; 

int main() { 
    que iter; 
    iter += 3; 
    return 0; 
} 

내가 3 행으로 2 호선을 대체 할 (대한 문 "만약" "?").
3의 주석을 제거하면 컴파일러에서 오류가 발생합니다.
1 번 줄을 삭제하면 3 번 줄이 작동합니다.
질문 : 컴파일러가 나에게 원하는 것은 무엇입니까?
오류 : 오류 : GCC-4.5.2

+0

오류 메시지는 무엇입니까? –

+0

오류 : 컨텍스트 유형 정보없이 오버로드 된 함수의 주소 – all

+0

여기서 함수 포인터를 사용해야합니까? 왜 'operator ++'를 반복해서 호출하지 않는가? –

답변

6

error: address of overloaded function with no contextual type information

operator++ 이름을 가진 두 개의 기능 (즉 메시지의 '오버로드 기능'비트의가 있습니다 : 어떤 상황에 맞는 유형의 정보
컴파일러와 오버로드 된 함수의 주소

n > 0 ? (que& (que::*)())&que::operator++ : 0 

당신은 위의 표현식은 포함하는 전체 표현, go에 할당 독립적 것을 고려해야합니다 :), 당신은 당신이 원하는 하나를 지정해야합니다 (즉, '콘텐츠 유형 정보'하나)입니다. 따라서 자체적으로 정확해야합니다. 즉, 특정 하위 표현식의 일부가 아니기 때문에 go 유형을 사용하여 올바른 오버로드를 선택할 수 없습니다.

+0

"go"선언에서이 정보를 얻을 수 있다고 생각했습니다. – all

+0

@all 네 말이 맞아, 나는 시정했다. –