首页 > 解决方案 > 错在哪里?

问题描述

编译器错误 错误 C2440 '=': 无法从 'const std::basic_string,std::allocator>' 转换为 'const char *'

int main(void)
{

    /*
    complier error
    Error   C2440    '=': cannot convert from 'const std::basic_string<char,std::char_traits<char>,std::allocator<char>>' to 'const char *' 
    primer  C:\Program Files (x86)\Microsoft Visual Studio\2019\Preview\VC\Tools\MSVC\14.22.27706\include\xutility  1745
    */
    list<string> names = {"A","B"};
    vector<const char*> vnames;
    vnames.assign(names.cbegin(), names.cend());//OK
    /*for (auto it = names.cbegin(); it != names.cend(); ++it)
    {
        cout << *it << endl;
    }*/
    for (auto it = vnames.cbegin(); it != vnames.cend(); ++it)
    {
        cout << *it << endl;
    }
    cout << "hello world" << endl;
    return 0;
}

标签: c++11

解决方案


这:

vnames.assign(names.cbegin(), names.cend());//OK

您的评论说“OK”,但它不正确。您不能将std::string对象分配给对象const char*。如果要获取每个的 C 字符串指针std::string并将其放入vnames中,则必须:

for (const auto& i : names) {
    vnames.push_back(i.c_str());
}

之后,您需要非常小心,不要以names任何会导致重新分配的方式修改向量。这样做会使存储在vnames.


推荐阅读