Во-первых, ваша терминология неверна. Вы не хотите конвертировать в char
, который является одним символом. Я понимаю, что в сообщении об ошибке утверждается, что вы пытаетесь преобразовать в char
, но это потому, что ваш неверный код сбил с толку компилятор, заставляя его думать, что вы пытаетесь инициализировать отдельные элементы массива name
. Будьте осторожны с особенностями сообщения об ошибке, когда пишете неправильный код, потому что компилятор не может прочитать ваши мысли & mdash; это может только уйти от того, что вы написали!
На самом деле вы хотите скопировать символы внутри вашего std::string
в массив из char
, который является вашим членом.
Вроде так:
Somewhere::SomeMethod(std::shared_ptr<SomeArgumentClass> args)
{
const auto& name = args->GetName();
const auto& address = args->GetAddress();
::MyStruct newValue;
std::copy(std::begin(name), std::end(name), &newValue.name[0]);
std::copy(std::begin(address), std::end(address), &newValue.address[0]);
// add newValue to some structure that needs to have chars
}
Но вам также нужно добавить проверку границ. Чтобы сделать это, примерно я мог бы рассмотреть замену каждого вызова std::copy
чем-то вроде:
std::copy_n(
&name[0],
std::min(name.size(), sizeof(newValue.name)),
&newValue.name[0]
);
Вам также потребуется некоторое нулевое завершение в зависимости от того, сколько символов было скопировано.
В целом, хотя существенным моментом является то, что вам действительно нужно скопировать эти символы, потому что нет одношагового способа сделать это. Отчасти это связано с тем, что массивы нельзя назначать, а также с тем фактом, что их размеры являются частью типа, что усложняет задачу.
Если это похоже на боль в заднице, это потому, что это & mdash; в идеале вы должны придерживаться std::string
по всем направлениям, потому что он намного лучше и специально разработан для облегчения работы с массивами char
. Вы все еще можете передать const char*
(или char*
!), Указывающий на данные строки, в C API. Конечно, если ::MyStruct
сам по себе является сторонним C-типом, у вас нет другого выбора, кроме как сделать это трудным путем.