0

我正在用 boost::tokenizer 替换 RWCTokenizer 并且我无法编译它,因为代码是当前设计的。这就是它现在基本上在做的事情:

parse.h
    RWCTokenizer*           myTokenizer;

parse.C
function parse::A
    myTokenizer = new RWCTokenizer(myTokenLine);

function parse::B
    token =  ((*myTokenizer)());

function parse::C
    if(myTokenizer == EcDNull)
    {
        return ""; // end of tokens
    }

所以基本上他们在 A 中设置解析,在 B 中获取标记,并在 C 中检查结尾。

因此,我需要在包含中声明迭代器和 tok 变量,以便 A、B 和 C 可以访问它们。但是当我编译时,myTok 说它需要 2 个参数,所以我不知道如何保存该信息。这是目前我试图做的:

parse.h
    boost::tokenizer< boost::char_separator<char> > myTok;
    boost::tokenizer< boost::char_separator<char> >::iterator myTokenizer2;

parse.C
    function parse::A
    boost::char_separator<char> sep(" ");   // break on white space
    std::string myTokenLine_TMP = myTokenLine.data();
    boost::tokenizer< boost::char_separator<char> > tok(myTokenLine_TMP, sep);
    myTokenizer = tok.begin();
    myTok = tok;

    function parse::B
    RWCString token = *myTokenizer;
    myTokenizer++;

    function parse::C
    if (myTokenizer == myTok.end())
    {
        return "";   // end of tokens
    }

我在网上看到的唯一示例是 ac main 函数中的 boost 代码,其中所有示例与 C++ 类示例相比。现在我唯一能想到的另一件事是在类的顶部声明 boost 的东西是静态的,这是我真的不想做的事情。

如果我可以保存 myTok.end() 部分,我应该能够编译。但我认为我需要保持结构,因为我正在解析的行被传递到 tok(myTokenLine_TMP, sep) 并且当我离开函数时它应该超出范围,因此保存 end() 部分将毫无用处。

那么如何在 C++ 类中做到这一点呢?

4

2 回答 2

0

要在 C++ 类中执行此操作,您只需使标记器成为您的类的成员,例如

class MyClass
{
private:
     boost::tokenizer<boost::char_seperator<char>> m_tokenizer;
};
于 2018-03-26T15:22:06.260 回答
0

我决定编写一个使用 strtok 与 boost 分词器的辅助类,这将允许我复制 Roguewave 分词器类。

于 2018-03-30T14:13:07.040 回答