2010-05-25 1 views
3

(참고 : FUNC와 FUNC2가 오타되지 않음)오버로드 연산자 호출 -> 컴파일 된 시간에 해결 되었습니까? : 나는 코드를 컴파일하려고

struct S 
{ 
    void func2() {} 
}; 

class O 
{ 
public: 
    inline S* operator->() const; 
private: 
    S* ses; 
}; 

inline S* O::operator->() const 
{ 
    return ses; 
} 

int main() 
{ 
    O object; 
    object->func(); 
    return 0; 
} 

컴파일 오류가보고 :

D:\code>g++ operatorp.cpp -S -o operatorp.exe 
operatorp.cpp: In function `int main()': 
operatorp.cpp:27: error: 'struct S' has no member named 'func' 

가가가의 오버로드 된 함수를 호출 보인다 "operator->"는 컴파일 타임에 완료됩니까? 컴파일에만 "-S"옵션을 추가했습니다.

+1

+1을 작성하여 좋은 보고서를 작성하십시오. 소스 및 컴파일 오류로 인해 "컴파일에 실패했습니다"보다 훨씬 간단합니다. – daramarak

답변

1

object->func()은 사용자 정의 유형의 경우 object->operator->()->func()의 구문 설탕입니다. O::operator->()S*을 생성하기 때문에 컴파일시에 S::func() 메서드가 있어야합니다.

+0

감사합니다. 당신의 대답은 운영자 -> 분명히합니다. – Brent81

10

예, 일반 함수 호출처럼 취급됩니다. 오버로드 된 연산자로 호출됩니다. 컴파일러는 컴파일 타임에 모든 것이 유효한지 확인합니다. C++은 동적 언어와 같지 않습니다. p->mynonexistantfunction()이 함수의 유효한 이름이거나 아닌 경우 런타임이 작동 할 때까지 기다리지 만 함수 이름이 존재하지 않으면 컴파일러는 컴파일 타임에 코드를 거부합니다.

이 경우는 오타처럼 보입니다. S는 func2()이지만 코드는 func()입니다.

+0

AshleysBrain : 다른 함수 이름을 정의해야합니다. 고마워, 나는 더 나은 이름을 사용해야했다. – Brent81

2

예, 컴파일러는 다른 함수와 마찬가지로 연산자를 결과로 검사합니다. 결과는 동일 할 것이다

S* foo() { ... } 

(foo())->func(); 

이 경우

당신이 가지고있는 경우, 예를 들어,.

3

구조체 S에서 func2()를 선언했지만 main에서 func()를 호출하려고합니다.

는 런타임에 이름으로 클래스 멤버를 선택할 수 없습니다 C++ 언어로 int main() { O object; object->func2(); return 0; }

2

을 시도합니다. 클래스 멤버 선택 (즉석 멤버 이름에 의한)은 컴파일시 항상 수행됩니다. 주변에는 방법이 없습니다.

런타임에 멤버 선택을 구현하려는 경우 사용할 수있는 유일한 연산자는 .*->* (이전 - 오버로드 불가능)입니다. 그러나 내장 연산자 형식의 연산자는 포인터를 구성원을 오른쪽 피연산자로 간주합니다. 이름 (문자열)을 사용하여 무언가를 선택하려는 경우 ->*을 오버로드하여 다른 인수 유형을 만들 수 있지만 어떤 경우에도 문자열에서 실제 멤버로 수동으로 매핑을 구현해야합니다. 그러나 멤버 함수 (데이터 멤버와는 반대)에서는 일반적으로 꽤 까다 롭습니다.