2010-03-16 2 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

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

ответ

3

Да, они могут быть перегружены по ссылке или нет. Вот почему это прекрасно, что они так сосуществуют; они разные.

Проблема связана с двусмысленностью. В то время как f(1) можно вызывать только по одному варианту, f(i) можно вызвать на обоих. Также не желательно, поэтому вы получаете ошибку для двусмысленности. Если вы добавили третью функцию, foo (const int&), все звонки были бы двусмысленными. Но все они все еще перегружены друг от друга и не конфликтуют.

Я согласен, что странно иметь три перегрузки функции и иметь возможность напрямую называть их. Возможно, у кого-то еще есть что добавить.

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

+1 для умных :) – GManNickG

+5

'(a. * F) (i) , должно быть достаточно. –

+1

Вы, вероятно, имели в виду (a. * T) (i); (не (a. * f)) – a1ex07

 Смежные вопросы

  • Нет связанных вопросов^_^