문제

나는 대답을 얻었다! 가치를 통과하고 참조로 통과하는 것은 발신자와 동일하게 보이기 때문입니다.

그러나 아래 코드는 올바르게 컴파일됩니다

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;
}

컴파일러가 사용될 것이라는 것을 알더라도 컴파일러가 비활성화되지 않는 이유는 무엇입니까?

도움이 되었습니까?

해결책

예, 참조 여부에 따라 과부하 할 수 있습니다. 그렇기 때문에 그들이 그렇게 공존하는 것이 완벽하게 괜찮습니다. 그들은 다르다.

문제는 모호성과 관련이 있습니다. 하는 동안 f(1) 하나의 변형만으로 호출 할 수 있습니다. f(i) 둘 다를 호출 할 수 있습니다. 어느 쪽도 바람직하지 않으므로 모호성에 대한 오류가 발생합니다. 세 번째 기능을 추가하면 foo (const int&), 모두 전화는 모호합니다. 그러나 모두는 여전히 서로의 과부하와 비 분쇄입니다.

나는 3 개의 과부하의 함수를 가질 수 있고 직접 전화 할 수 있다는 것이 이상하다는 데 동의합니다. 아마도 다른 사람이 추가해야 할 것이 더 많을 것입니다.

다른 팁

각 방법을 호출 할 수 있습니다.

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)
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top