我有以下情况:
struct MyStruct
{
char name[25];
char address[12];
}
Somewhere::SomeMethod(std::shared_ptr<SomeArgumentClass> args)
{
// GetName() and GetAddress() both return std::strings
::MyStruct newValue = {args->GetName(), args->GetAddress()};
// add newValue to some structure that needs to have chars
}
错误:
error C2440: 'initializing' : cannot convert from 'std::string' to 'char'
error C2440: 'initializing' : cannot convert from 'std::string' to 'char'
我无法将std :: string转换为char。
非常感谢!
答案 0 :(得分:4)
首先,您的术语不正确。您不想转换为char
,这是一个字符。我意识到该错误消息声称您正在尝试转换为char
,但这是因为您的错误代码使编译器误以为您正在尝试初始化数组name
的各个元素。当您编写错误的代码时,请警惕错误消息的具体内容,因为编译器无法理解您的想法-它只会超出您编写的内容!
实际上,您要将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]
);
根据复制的字符数,您还需要一些空终止符。
尽管通常要注意的一点是您实际上需要复制这些字符,因为没有单步执行的方法。这部分是由于无法将数组分配给它,也源于它们的维是该类型的一部分,这使事情变得更加复杂。
如果这似乎使人痛苦不堪,那是因为-理想情况下,您应该坚持使用std::string
,因为它要优越得多,并且专门为简化处理{{ 1}}。您仍然可以将指向字符串数据的char
(或const char*
!)传递到C API中。当然,如果char*
本身是第三方C类型,则别无选择,只能艰难地做到这一点。