2011-12-22 6 views
1

AnsiString(someStr).c_str()boost::split()第2引数に渡そうとしていますが、引数の不一致を示していません。ここで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()); 

しかし

ブースト::スプリット(SVECは、 "これはテストです"、ブースト:: is_any_ofを(」「))です。

がうまく機能します。

私はAnsiStringをC文字列型に変換していますか? sVecので

答えて

2

vector<std::string>なくvector<char *>あり、split()に渡された第二の引数は何とかstd::stringインスタンスに変換されなければなりません。

透過的に(あなたの第二の例が成功した理由です)const char *からインスタンスを作成することができますstd::stringクラスの暗黙のコンストラクタがありますが、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

残念ながらいずれも動作しません!勝ち目がない ! 'boost :: algorithm :: split <>(vector >、const char *、boost :: algorithm :: detail:)の一致を見つけることができませんでした。[BCC32 Error] Unit1.cpp(25):E2285 'boost :: algorithm :: split < :) ' 完全なパーサーコンテキスト 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()); 
    }