2010-03-16 4 views
7

답변이 없습니다. 왜냐하면 값으로 전달하고 참조로 전달하는 것이 호출자와 동일하기 때문입니다.매개 변수가 값인지 참조인지에 따라 함수를 오버로드 할 수 있습니까?

그러나, 아래 코드는 바로

class A { 

public: 
void f(int i) {}  

void f(int& i) {} 
}; 

를 컴파일하지만 그것을 사용하려고하면, 컴파일 오류가있다.

int main() { 

    A a; 
    int i = 9; 
    int& j = i; 
    a.f(1); 
    a.f(i); 
    a.f(j); 
    return 0; 
} 

컴파일러가 사용하지 않는다고해도 왜 비활성화하지 않습니까?

+2

합니다. –

+3

돌기 : http://stackoverflow.com/questions/930323/f5-and-int-x-fx-to-call-different-functions –

답변

3

예, 참조에 따라 오버로드 될 수 있습니다. 그렇기 때문에 그것들을 공존시키는 것이 완벽하게 좋은 것입니다. 그들은 다르다.

문제는 모호성과 관련이 있습니다. f(1)은 하나의 대안 콘텐츠에서만 호출 할 수 있지만 f(i)은 둘 다 호출 할 수 있습니다. 어느 쪽도 바람직하지 않으므로 모호성에 대한 오류가 발생합니다. 세 번째 함수를 추가하면 foo (const int&), 모두 호출이 모호합니다. 그러나 모든 것은 여전히 ​​서로의 과부하이며 충돌하지 않습니다.

나는 함수의 오버로드를 3 가지 가질 수 있고 none을 직접 호출 할 수 있다는 것이 이상하다는 데 동의합니다. 아마도 다른 사람이 더 추가 할 수 있습니다.

9

당신은 각 메서드 호출 할 수 있습니다 : 당신이 실제 컴파일러 오류 및 라인 수를 보였다 경우 도움이 될

void (A::*t)(int&) =&A::f; 
A a; 
int i = 9; 
int& j = i; 
a.f(1); // f(int i) 
(a.*t)(i); // f(int& i) 
+1

영리한 분께 : – GManNickG

+5

'(a. * f) (i) ; 충분해야합니다. –

+1

아마 당신은 (a. * t) (i)를 의미했을 것입니다; (아닙니다 (a. * f)) – a1ex07

관련 문제