2012-01-28 27 views
1

我正在製作一個靈魂:: qi的解析器並且旨在使它與不同的字符大小兼容。精神:: qi ::不同字符大小的語法名稱

template < typename Iterator > 
struct grammar : qi::grammar <Iterator> 
{ 
    grammar() : grammar::base_type (file, alter_string_size_to <Iterator::value_type> (_szFile)) 
    { 

    } 

    qi::rule <Iterator> file; 
}; 

鑑於

alter_string_size_to <Iterator::value_type> (_szFile) 

成功返回一個指針,指向包含在_szFile所需字符尺寸的字符串。

當我編譯

Iterator = std::wstring::const_iterator 

我得到以下錯誤消息

cannot convert parameter 2 from 'unsigned short *' to 'const std::string &' 

所以..語法:: base_type只期待一個常量的std :: string &作爲第二個參數。 我的問題是,我怎麼能告訴qi ::語法期望一個字符串與它的迭代器value_type大小?

在此先感謝!

+0

我在我的帖子中說過如果Iterator :: value_type是char,它會返回一個const char * ...當它的wchar_t,它返回const wchar_t * ...我沒有包含任何代碼,因爲它有絕對沒有目的,問題是語法:: base_type如何接受別的比const std :: string&作爲第二個參數,例如const std :: wstring&... 編輯:評論刪除之前我寫完我的答案^。^無論如何,我把它留在,以防其他人問什麼alter_string_size_to是.. – Andy 2012-01-28 03:40:54

+0

在你的第一個代碼示例中,你在'Iterator :: value_type'前面缺少'typename'(假設它的意思是類型嵌套在'Iterator'中)。 – 2012-01-28 03:42:37

+0

是的,我明白了......但是我對你有壞消息) – vines 2012-01-28 03:42:46

回答

0

它定義爲源如下:

grammar(
     start_type const& start 
     , std::string const& name_ = "unnamed-grammar") 
    : proto::extends<terminal, base_type>(terminal::make(reference_(start))) 
    , name_(name_) 
    {} 

    std::string name_; 

,所以你不能。由於它在Doc的規定:

名稱是一個可選的字符串,給出了語法它的名字,調試和錯誤處理有用。

所以,你必須根據它做出你自己的查找。

+0

謝謝你的回答。我希望能有一些複雜的qi :: grammar或者我還沒有讀過的更復雜的解決方法。我仍然無法真正相信它,精靈的製造者們所有的模板叢林都沒有想過如何使語法/規則名稱 - 用於錯誤輸出 - 與它解析的輸入相同的字符大小。如果這是真的,那麼它是一個巨大的失敗.. Ima等待一段時間,希望有人看到我的問題誰知道一個不硬解決方案,然後我將您的答案切換爲接受。 – Andy 2012-01-28 03:57:16