2012-02-20 43 views
5

this其他问题的接受答案会引导我到this样本,但编译它会给出一个长的错误列表。下面的示例代码中,我添加只是包括和伪主():错误编译精灵样本

#include <boost/spirit/include/qi.hpp> 
#include <vector> 
#include <map> 
#include <string> 
#include <iostream> 

namespace qi = boost::spirit::qi; 

template <typename Iterator> 
struct keys_and_values 
    : qi::grammar<Iterator, std::map<std::string, std::string>()> 
{ 
    keys_and_values() 
     : keys_and_values::base_type(query) 
    { 
     query = pair >> *((qi::lit(';') | '&') >> pair); 
     pair = key >> -('=' >> value); 
     key = qi::char_("a-zA-Z_") >> *qi::char_("a-zA-Z_0-9"); 
     value = +qi::char_("a-zA-Z_0-9"); 
    } 
    qi::rule<Iterator, std::map<std::string, std::string>()> query; 
    qi::rule<Iterator, std::pair<std::string, std::string>()> pair; 
    qi::rule<Iterator, std::string()> key, value; 
}; 

int main(int argc, char **argv) 
{ 
    std::string input("key1=value1;key2;key3=value3"); // input to parse 
    std::string::iterator begin = input.begin(); 
    std::string::iterator end = input.end(); 

    keys_and_values<std::string::iterator> p; // create instance of parser 
    std::map<std::string, std::string> m;  // map to receive results 
    bool result = qi::parse(begin, end, p, m); // returns true if successful 
} 

我都试过提高(在我的Ubuntu 11.04发行版默认值)1.42,和1.48(下载)。错误(我报告由QtCreator过滤的)不同:版本1.42给出

/usr/include/boost/fusion/support/tag_of.hpp:92:13: error: no matching function for call to ‘assertion_failed(mpl_::failed************ boost::mpl::not_<boost::fusion::detail::is_specialized<std::pair<std::basic_string<char>, std::basic_string<char> > > >::************)’ 

/usr/include/boost/spirit/home/support/attributes.hpp:409: error: no matching function for call to ‘std::basic_string<char>::basic_string(std::pair<std::basic_string<char>, std::basic_string<char> >&)’ 

/usr/include/boost/spirit/home/support/attributes.hpp:409: error: no matching function for call to ‘std::basic_string<char>::basic_string(mpl_::void_&)’ 

while ver。 1.48给出

/home/carlo/Projects/spirit_vect_literals-build-desktop/../../cpp/boost_1_48_0/boost/spirit/home/qi/detail/assign_to.hpp:123: error: no matching function for call to ‘std::pair<std::basic_string<char>, std::basic_string<char> >::pair(const std::basic_string<char>&)’ 

我有什么遗漏吗?

编辑:我已经找到了解决办法:这个报头和两个版本的编译

#include <boost/fusion/adapted/std_pair.hpp> 

回答

5

恭喜跟踪下来......我打了同样的错误在几个星期前,浪费小时它。当你找到了,解决办法就是包括这个:

#include <boost/fusion/adapted/std_pair.hpp> 

它提供了必要的魔术齐使用std ::对作为规则的输出。

我主要在这里留下这个答案,所以这个问题不再显示为未答复 - 如果你想添加/接受你自己的答案,我会收回这个。

+0

这是一个严重的常见问题,尽管公平性是[托马斯海勒评论](http://boost-spirit.com/home/articles/qi-example/parsing-a-list-of-key对这篇文章:) – sehe 2012-02-21 22:11:34

+0

@sehe:我发现在阅读和重读网页和许多尝试(部分成功,但通常令人沮丧)制作我的超小测试用例。我不能相信**包括**可以解决我的问题。什么伤害了我,就是这些文档隐藏了Hartmut Kaiser清楚地说明的简单... – CapelliC 2012-02-21 22:39:04

+0

@chac是的,这是页面社区维护的耻辱,或者我亲自编辑#include在那里。 – sehe 2012-02-21 22:58:09