Преобразование строковых литералов в char*
больше не разрешено, поскольку это никогда не было безопасно. Вместо этого создайте массив из const char*
. (Хотя я не уверен на 100%, что это является причиной вашей ошибки, но ваш код не соответствует вашей ошибке, я думаю, что вы изменили что-то, чтобы поместить его в SO). std::string
имеет конструктор из const char*
, поэтому он должен работать нормально.
Также приятно отметить, что (const::std string &
не так, поэтому мы знаем , что вы изменили материал, когда разместили его здесь. Не делай этого, иначе мы не сможем тебе сильно помочь. Это должно быть (const std::string&
.
Кроме того, MrC64 отмечает, что вы должны использовать RAII вместо необработанных массивов и указателей. Это проще в использовании, и сложнее испортить.
std::vector<std::string> classfname = {
"classifiers/cabmodel_VOC05motorbikes.xml",
"classifiers/cabmodel_interm_nst100_VOC06person01train5_orienthistmod.xml" ,
"classifiers/cabmodel_interm_nst40_VOC06cat01train5_trainval_orienthistmod_nopert_facereg.xml",
"classifiers/cabmodel_interm_nst100_VOC06bicycle01train5_trainval_orienthistmod.xml",
"classifiers/cabmodel_VOC06carside.xml",
"classifiers/cabmodel_interm_nst100_VOC06horse01train5_trainval_orienthistmod_randsel0100.xml"
};
Если ваш компилятор еще не может обработать этот синтаксис (многие не могут), используйте код, предложенный Mr_C64.
[РЕДАКТИРОВАТЬ] Вы значительно изменили свой вопрос, чтобы стать совершенно другим вопросом Обычно это плохо, потому что любой, кто придет на эту страницу в поисках ответов, увидит, что наши ответы больше не соответствуют вашему вопросу. Если у вас есть дополнительные вопросы, вам следует воспользоваться функцией поиска или создать новую страницу с вопросом.
Теперь ваш код имеет std::vector
из std::strings
. Относитесь к std::string
, как к int
. Просто скопируйте его или раздайте без забот. Вам не нужно использовать специальную функцию для копирования int
, поэтому вам не нужна специальная функция для копирования строки. Просто сделайте std::string newstring = classfname[0];
, чтобы получить копию строки с индексом 0
в массиве classfname
.
Ваш «старый» код создает массив символов, инициализированный строковым литералом, и переопределяет его с помощью ввода argv[i]
. Лучший способ сделать этот код:
std::string classfname = "classifiers/cabmodel_VOC05motorbikes.xml";
classfname = argv[i];
Если вы просто хотите создать массив каждого из аргументов, это просто:
int main() {int argc, const char** argv) {
std::vector<std::string> classfname(argv, argv+argc);