Как сделать неоднозначный вызов отличным в C ++? - PullRequest
3 голосов
/ 24 декабря 2009
void outputString(const string &ss) {
    cout << "outputString(const string& ) " + ss << endl;
}

void outputString(const string ss) {
    cout << "outputString(const string ) " + ss << endl;
}

int main(void) {
    //! outputString("ambigiousmethod"); 
    const string constStr = "ambigiousmethod2";
    //! outputString(constStr);
} ///:~

Как сделать внятный звонок?

РЕДАКТИРОВАТЬ : Этот фрагмент кода может быть скомпилирован с g ++ и MSVC.

спасибо.

Ответы [ 4 ]

10 голосов
/ 24 декабря 2009

C ++ не позволяет вам перегружать функции, где единственное различие в сигнатуре функции состоит в том, что один берет объект, а другой ссылается на объект. Так что-то вроде:

void foo(int);

и

void foo(int&);

не допускается.

Вам необходимо изменить номер и / или тип параметра.

В вашем случае функция, которая принимает reference, вы можете заставить ее принять pointer, если вы хотите разрешить функции изменять свой аргумент.

1 голос
/ 24 декабря 2009

Вы можете изменить подпись одного из методов. Это может не выглядеть красиво, однако это самый простой способ.

Так что вы могли бы в принципе иметь

void outputString(const string &ss, int notneeded) {
    cout << "outputString(const string& ) " + ss << endl;
}

void outputString(const string ss) {
    cout << "outputString(const string ) " + ss << endl;
}

и когда вы хотите вызвать первую функцию, просто вызовите ее с помощью:

outputString("ambigiousmethod", 0);

, что приведет к отличительному вызову.

Другого пути нет (хотелось бы, чтобы в этом его ошиблись), поскольку C ++ не допускает перегрузки, когда передача (по значению или по ссылке) - единственная разница в сигнатуре.

Редактировать: как указал bzabhi, вы также можете изменить подпись, изменив ссылку на указатель. В приведенном вами примере это сработает, однако в некоторых случаях вам может потребоваться изменить код функции.

0 голосов
/ 09 апреля 2010

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

0 голосов
/ 24 декабря 2009

Согласно вашему коду, вам нужно только

void outputString(const string &ss).

Поскольку оба метода не могут изменить аргумент для вызывающей стороны (потому что это константная ссылка или передача по значению).

Зачем вам эти 2 метода?

...