С++ GCC, значение по умолчанию - контейнер STL
Код следующий:
Код:
void someFunc(параметры, map<QString, set<uint> >& myMap = map<QString, set<uint> >())
std:: опускаю для краткости.
При переходе на Linux, данный код не хочет компилироваться, кажется пишет, что ошибка возле скобки, но точно не помню, если убрать значение по умолчанию, то все нормально.
Причем важно иметь значение по умолчанию, так как функцией пользуются многочисленные клиенты и её надо модифицировать не затронув работающих приложений.
------------
Ещё один вопрос, но менее важный.
В рекурсивную функцию надо передать копию строки, которая должна существовать на время работы функции.
Написал под винду вызов функции (и код работает):
Код:
someFunc(QString(str));
Под GCC пришлось переделать из за ошибки такого вызова
Код:
QString str_temp(str);
someFunc(str_temp);
someFunc(str_temp);
Компилятор такого не позволяет, и, вообще говоря, наверное, правильно.
Соответственно, если содержимое map в функции не меняется, то просто добавьте const к определению аргумента:
Код:
void someFunc(параметры, const map<QString, set<uint> >& myMap = map<QString, set<uint> >())
Если изменяется, то стоит перегрузить функцию для варианта одного аргумента.
Я, в принципе, разобрался - убрал ссылку.
Но про константность не догадался, попробую, но в дело, к сожалению, наверное, уже не пойдет - сдал измененный заголовочный файл без ссылки.
Цитата: andrey_hello2007
Я, в принципе, разобрался - убрал ссылку.
Неправильное решение.
Цитата: andrey_hello2007
Но про константность не догадался
В общем случае тоже неправильное решение.
Правильным решением будет перегрузка ф-ции.
Цитата: Green
Правильным решением будет перегрузка ф-ции.
Почему?
Не поняв причину правильности правильные решения не запоминаются.
Хотя догадываюсь:
Изменив семантику, всем все равно надо перекомпилироваться, а при перегрузке нет.
Да?
1) объекты надо передавать по ссылке, это сильно влияет на производительность;
2) констатной ссылка имеет место быть только, если ты не собираешься ничего изменять в передаваемом объекте,
3) а какой смысл конструировать пустой объект, передавать его по константной ссылке? Что хорошего можно получить от пустого константного объекта? Поэтому для такого случая и проще и полезнее сделать отдельную имплементацию ф-ции без этого параметра вовсе.
Главная задача, меньше затронуть тех, кому не нужно новое расширение функции.
Интересно, если использовать перегруженную функцию, то наверное не надо "старым" пользователям перекомпилировать свои приложения, запускающие мои?
Сегодня уже были кислые лица... Так как я свое выложил, не работало (надо перекомпилировать с новым объявлением функции), а человек который должен сделать использование новшества еще свою часть не доделал.
extern "C"