Câu trả lời được chấp nhận cho this câu hỏi khác đưa tôi đến this mẫu, nhưng biên dịch nó đưa ra một danh sách lỗi dài. Ở đây mã mẫu, tôi đã thêm vào chỉ bao gồm và một giả chính():lỗi biên soạn mẫu Thần
#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
}
Tôi đã thử cả tăng 1,42 (mặc định trên bản phân phối Ubuntu 11,04) và 1,48 (đã tải xuống). Lỗi (Tôi báo cáo những người được lọc bởi QtCreator) khác nhau: ver 1.42 cung cấp cho
/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_&)’
trong khi ver. 1.48 cung cấp cho
/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>&)’
Tôi có gì bị thiếu không?
chỉnh sửa: Tôi đã tìm thấy các giải pháp: thêm tiêu đề này và cả hai phiên bản biên dịch
#include <boost/fusion/adapted/std_pair.hpp>
yup là một faq nghiêm trọng, mặc dù công bằng là [bình luận của Thomas Heller] (http://boost-spirit.com/home/articles/qi-example/parsing-a-list-of-key -giá trị-cặp-sử dụng-tinh thần-qi/bình luận-trang-1/# bình luận-160) về bài viết đó :) – sehe
@sehe: Tôi thấy rằng dòng nhỏ sau khi các trang và các trang đọc nặng và nhiều nỗ lực (một phần thành công, nhưng nói chung là bực bội) của việc tạo ra trường hợp thử nghiệm nhỏ thêm của tôi. Tôi không thể tin rằng ** bao gồm ** có thể giải quyết vấn đề của tôi. Điều làm tôi đau lòng, đó là tài liệu che giấu sự đơn giản được minh họa rõ ràng bởi Hartmut Kaiser ... – CapelliC
@chac Vâng, đó là một sự xấu hổ mà trang đó được duy trì bởi cộng đồng, hoặc tôi muốn chỉnh sửa #include trong đó. – sehe