Где вина? - PullRequest
       20

Где вина?

0 голосов
/ 26 мая 2019

ошибка компилятора Ошибка 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;
}

1 Ответ

0 голосов
/ 26 мая 2019

Это:

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

Ваш комментарий говорит "ОК", но это не ОК.Вы не можете присвоить std::string объектам const char* объектам.Если вы хотите получить строковые указатели C каждого std::string и поместить их в vnames, то вам необходимо:

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

После этого вам нужно быть очень осторожным, чтобы не изменять names вектор любым способом, который вызовет перераспределение.Это сделает недействительными указатели, хранящиеся в vnames.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...