C ++ специфический синтаксис для добавления аргумента по умолчанию - PullRequest
0 голосов
/ 14 декабря 2011

Представьте, что у вас есть функция X () по всей вашей кодовой базе. Требуется три аргумента. Прототип выглядит примерно так:

В заголовочном файле:

void X(string a, int b, string c);

В файле .cpp:

void myclass::X(string a, int b, string c) {
...
}

Предположим, вы добавляете в кодовую базу и вам необходимо передать 4-й аргумент. к Х только в одном месте. Все вызовы с тремя аргументами должны оставаться на месте. Вы хотели бы не нарушать все версии с тремя аргументами вызовов X.

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

В заголовочном файле:

void X(string a, int b, string c, string d);    
void X(string a, int b, string c, string d="default_value");

Любые предложения о том, как правильно добавить один вызов с четырьмя аргументами, не прерывая все вызовы с тремя аргументами, приветствуются - спасибо!

Ответы [ 4 ]

3 голосов
/ 14 декабря 2011

Просто добавьте новый прототип, оставив предыдущий без изменений:

string X(string a, int b, string c);    
string X(string a, int b, string c, string d);

Невозможно назначить значение по умолчанию для нового аргумента, так как это может привести к неоднозначности: компилятор не сможетзнать, какой из методов вы хотите вызвать.

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

СОВЕТ:

В соответствии с вашим синтаксисом, я думаю, что вы используете

using namespace std;

в своем заголовке,Это плохая практика.При этом глобальное пространство имен заполняется пространством имен std, где бы вы ни включали этот заголовок.Вы должны удалить эту директиву и вместо этого указать ваши типы: std::string вместо string

1 голос
/ 14 декабря 2011

В заголовочном файле вам нужно иметь две функции

void string X(string a, int b, string c);
void string X(string a, int b, string c, string d);

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

0 голосов
/ 14 декабря 2011

Этот пример компилируется с максимальным уровнем предупреждения:

#include <iostream>
#include <string>

void foo(std::string , int , std::string , std::string d="default_value")
{
    std::cout<<"d="<<d<<std::endl;
}


int main() {
    foo("param1",55,"param2");
}

Последний параметр функции foo имеет значение по умолчанию.

0 голосов
/ 14 декабря 2011

Вам нужно только второе определение в заголовочном файле. Наличие обоих из них - то, что создает ошибку перегрузки.

void string X(string a, int b, string c, string d="default_value");

Означает, что когда задано 4 значения, используйте предоставленное d, а когда задано только 3, установите d в значение "default_value".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...