4

こんにちは、ブースト ライブラリのトークナイザー クラスを使用してトークナイザーを機能させようとしています。ブーストのドキュメントでこのチュートリアルを見つけました:

http://www.boost.org/doc/libs/1 _36 _0/libs/tokenizer/escaped _list _separator.htm

問題は、エスケープされた _list _separator("","",""); の引数を取得できないことです。

しかし、boost/tokenizer.hpp ファイルを変更すると動作します。しかし、それはそうではなく、理想的な解決策は、エスケープされた _list _separator に異なる引数を取得するために不足しているものがあるかどうか疑問に思っていました。

エスケープ用に " と ' を使用してスペースで分割し、引用符で囲まれた文字列内にエスケープ文字を入れないようにしたい。

これは、ゲーム内コンソール システムの引数解析システムに使用されます。


include <iostream>
include <boost/tokenizer.hpp>
include <string>

int main() { using namespace std; using namespace boost; string s = "exec script1 \"script argument number one\""; string separator1("");//dont let quoted arguments escape themselves string separator2(" ");//split on spaces string separator3("\"\'");//let it have quoted arguments tokenizer<escaped_list_separator<char>(separator1,separator2,separator3)> tok(s); for(tokenizer<escaped_list_separator<char>(separator1,separator2,separator3)>::iterator beg=tok.begin(); beg!=tok.end();++beg) { cout << *beg << "\n"; } }

Visual Studio 2005 からのエラーはエラー C2974 です: 'boost::tokenizer' : 'TokenizerFunc' の無効なテンプレート引数、予期される型

編集: この質問は ferrucio によって分析され、peter によって説明されました。

4

3 に答える 3

15

これを試して:

#include <iostream>
#include <boost/tokenizer.hpp>
#include <string>

int main()
{
    using namespace std;
    using namespace boost;
    string s = "exec script1 \"script argument number one\"";
    string separator1("");//dont let quoted arguments escape themselves
    string separator2(" ");//split on spaces
    string separator3("\"\'");//let it have quoted arguments

    escaped_list_separator<char> els(separator1,separator2,separator3);
    tokenizer<escaped_list_separator<char>> tok(s, els);

    for(tokenizer<escaped_list_separator<char>>::iterator beg=tok.begin(); beg!=tok.end();++beg)
    {
        cout << *beg << "\n";
    }
}
于 2009-02-12T15:42:16.157 に答える
5

トークナイザーのタイプを正しく宣言していないようです。

typedef boost::tokenizer< boost::escaped_list_separator<char> > Tokenizer;
boost::escaped_list_separator<char> Separator( '\\', ' ', '\"' );
Tokenizer tok( s, Separator );

for( Tokenizer::iterator iter = tok.begin(); iter != tok.end(); ++iter )
{ cout << *iter << "\n"; }

TokenizerFunc としてセパレーター オブジェクトを使用してboost::tokenizer< boost::escaped_list_separator< char > >型指定されたオブジェクトを作成します。boost::escaped_list_separator< char >

于 2009-02-12T15:33:27.737 に答える