2011-12-22 4 views
1

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

здесь сниппет

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

однако

подталкивание :: Раскол код (Швец, "Это тест", повышение :: is_any_of (»«));

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

Я делаю правильное преобразование AnsiString в c string type ???

ответ

2

Поскольку 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

К сожалению, ни одно из них не работает! Не совпадает ! '[Ошибка BCC32] Unit1.cpp (25): E2285 Не удалось найти соответствие для 'boost :: algorithm :: split <> (vector >, const char *, boost :: algorithm :: detail: : is_any_ofF ) Полный контекст анализатора Unit1.cpp (22): синтаксический анализ: void _fastcall TForm1 :: Button1Click (TObject *) ' –

+0

Разрешение шаблона, по-видимому, не учитывает неявный конструктор. Когда вы говорите «ни одна работа», вы имеете в виду, что даже явный вызов конструктора приводит к той же ошибке? Это было бы странно, поскольку в этом случае нет никакой двусмысленности. –

+0

Да, конечно! Фредерик! Оба дают ошибку! –

0

Я сделал это таким образом, так как 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()); 
    }