рассогласование аргументов boost :: split - PullRequest
1 голос
/ 22 декабря 2011

Я пытаюсь передать AnsiString(someStr).c_str() второму аргументу boost::split(), но он запрещает показ несоответствия аргументов !!

вот фрагмент кода

vector<std::string> sVec;
boost::split(sVec,AnsiString(response).c_str(),boost::is_any_of(" "));//err in this line
ShowMessage(sVec[1].c_str());

однако

boost :: split (sVec, "Это тест", boost :: is_any_of (""));

работает хорошо!

Я делаюПравильное преобразование AnsiString в тип строки c ???

Ответы [ 2 ]

2 голосов
/ 22 декабря 2011

Поскольку sVec является vector<std::string>, а не vector<char *>, второй аргумент, передаваемый split(), должен быть каким-то образом преобразован в экземпляр std::string.

В классе std::string существует неявный конструктор, который может прозрачно создавать экземпляр из const char * (именно поэтому ваш второй пример успешен), но AnsiString :: c_str () возвращает char *, а не const char *, поэтому этот конструктор не применяется.

Выполнение преобразования самостоятельно должно решить вашу проблему:

boost::split(sVec, (const char *) AnsiString(response).c_str(),
    boost::is_any_of(" "));

Или, более точно:

boost::split(sVec, std::string((const char *) AnsiString(response).c_str()),
    boost::is_any_of(" "));
0 голосов
/ 22 декабря 2011

Я сделал это таким образом, поскольку boost::split(sVec, (const char *) AnsiString(response).c_str(), boost::is_any_of(" ")); выдает ошибку (к сожалению)

AnsiString response="This is a test";
    vector<std::string> sVec;
    const char * cStr=AnsiString(response).c_str();
    boost::split(sVec, cStr,boost::is_any_of(" "));

    for (int i = 0; i < sVec.size(); i++) {
            ShowMessage(sVec[i].c_str());
    }
...