Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

С++ GCC, значение по умолчанию - контейнер STL

14K
15 ноября 2008 года
andrey_hello2007
50 / / 30.05.2007
Писал код на VS .NET 2003

Код следующий:

 
Код:
void someFunc(параметры, map<QString, set<uint> >& myMap = map<QString, set<uint> >())


std:: опускаю для краткости.

При переходе на Linux, данный код не хочет компилироваться, кажется пишет, что ошибка возле скобки, но точно не помню, если убрать значение по умолчанию, то все нормально.

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

------------
Ещё один вопрос, но менее важный.
В рекурсивную функцию надо передать копию строки, которая должна существовать на время работы функции.

Написал под винду вызов функции (и код работает):

 
Код:
someFunc(QString(str));


Под GCC пришлось переделать из за ошибки такого вызова
 
Код:
QString str_temp(str);
someFunc(str_temp);
36K
17 ноября 2008 года
Alno
34 / / 23.06.2008
Проверил под g++, проблема в том, что аргумент - ссылка на карту, но она инициализируется из константного значения.

Компилятор такого не позволяет, и, вообще говоря, наверное, правильно.

Соответственно, если содержимое map в функции не меняется, то просто добавьте const к определению аргумента:

 
Код:
void someFunc(параметры, const map<QString, set<uint> >& myMap = map<QString, set<uint> >())


Если изменяется, то стоит перегрузить функцию для варианта одного аргумента.
14K
17 ноября 2008 года
andrey_hello2007
50 / / 30.05.2007
Спасибо!

Я, в принципе, разобрался - убрал ссылку.

Но про константность не догадался, попробую, но в дело, к сожалению, наверное, уже не пойдет - сдал измененный заголовочный файл без ссылки.
3
17 ноября 2008 года
Green
4.8K / / 20.01.2000
Цитата: andrey_hello2007

Я, в принципе, разобрался - убрал ссылку.


Неправильное решение.

Цитата: andrey_hello2007

Но про константность не догадался


В общем случае тоже неправильное решение.

Правильным решением будет перегрузка ф-ции.

14K
18 ноября 2008 года
andrey_hello2007
50 / / 30.05.2007
Цитата: Green

Правильным решением будет перегрузка ф-ции.



Почему?

Не поняв причину правильности правильные решения не запоминаются.

Хотя догадываюсь:
Изменив семантику, всем все равно надо перекомпилироваться, а при перегрузке нет.

Да?

3
18 ноября 2008 года
Green
4.8K / / 20.01.2000
Потому, что
1) объекты надо передавать по ссылке, это сильно влияет на производительность;
2) констатной ссылка имеет место быть только, если ты не собираешься ничего изменять в передаваемом объекте,
3) а какой смысл конструировать пустой объект, передавать его по константной ссылке? Что хорошего можно получить от пустого константного объекта? Поэтому для такого случая и проще и полезнее сделать отдельную имплементацию ф-ции без этого параметра вовсе.
14K
18 ноября 2008 года
andrey_hello2007
50 / / 30.05.2007
В общем правильно, но в моем случае этот пустой объект ни производительности ни памяти не повредит, так как функция - экспортная функция библиотеки вызывает экземпляр приложения.

Главная задача, меньше затронуть тех, кому не нужно новое расширение функции.

Интересно, если использовать перегруженную функцию, то наверное не надо "старым" пользователям перекомпилировать свои приложения, запускающие мои?

Сегодня уже были кислые лица... Так как я свое выложил, не работало (надо перекомпилировать с новым объявлением функции), а человек который должен сделать использование новшества еще свою часть не доделал.
14K
19 ноября 2008 года
andrey_hello2007
50 / / 30.05.2007
К сожалению функцию перегружать нельзя, так как она экспортируется:

extern "C"
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог