Редактировать: После реализации предложения Джеймса Хопкина, я все еще получаю предупреждения о "недопустимом имени" нуль "", что намного лучше, чем эти странные символы. Затем я вернулся и снова прочитал документ библиотеки, и оказалось, что для этой конкретной функции в ее аргументе должен быть еще один элемент не-NULL-строки, чем размер aNames. Эта дополнительная строка имеет другое назначение. После добавления еще одной строки код работает нормально. Это моя вина, и мне очень жаль.
Оригинальный пост:
Привет,
Это мой первый пост, поэтому, пожалуйста, будьте милы. Я искал в этом форуме и гуглил, но до сих пор не могу найти ответ. Эта проблема беспокоила меня больше суток, поэтому, пожалуйста, помогите мне. Спасибо.
Мне нужно передать вектор строки в библиотечную функцию foo (char const * const * const). Я не могу передать & Vec [0], так как это указатель на строку. Поэтому у меня есть массив, и я передаю c_str () в этот массив. Вот мой код (aNames - вектор строки):
const char* aR[aNames.size()];
std::transform(aNames.begin(), aNames.end(), aR,
boost::bind(&std::string::c_str, _1));
foo(aR);
Однако, кажется, что это вызывает некоторое неопределенное поведение:
Если я запускаю приведенный выше код, то функция foo выдает несколько предупреждений о недопустимых символах ('èI' blablabla) в aR.
Если я печатаю aR перед функцией foo следующим образом:
std::copy(aR, aR+rowNames.size(),
std::ostream_iterator<const char*>(std::cout, "\n"));
foo(aR);
Тогда все хорошо.
Мои вопросы:
Приводит ли преобразование к неопределенному поведению? Если так, то почему?
Как правильно передать вектор строки в foo (char const * const * const)?