basename
принимает char*
в качестве аргумента, который не является const
, что означает, что функции разрешено изменять значение.
const string& argv0
равно const
, что означает, что значение argv0
нельзя изменять.
Таким образом, вам не разрешено вызывать basename
с argv0.c_str()
в качестве параметра, поскольку это нарушит квалификатор const
.
Сообщение об ошибке ясно: 1st argument ... would lose const qualifier
.
Так что либо измените argv0
, чтобы оно не было const
(вероятно, не очень хорошая идея), либо измените basename
, чтобы принять параметр const char*
(вероятно, лучшая идея), или измените basename
работать с std::string
вместо char*
, как остальная часть вашего кода (вероятно, лучшая идея).
Так что, очевидно, basename
- это функция Unix, которую вы не можете изменить. (Спасибо, Невин!) Из справочной страницы:
И dirname (), и basename () могут изменять содержимое пути, поэтому может потребоваться передать копию при вызове одной из этих функций.
В этом случае я рекомендую создать копию argv0
. Самый простой способ сделать это - изменить подпись execname
на эту:
void exec::execname(std::string argv0)