2012-02-20 23 views
5

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> 

Trả lời

5

Chúc mừng theo dõi này xuống ... Tôi nhấn lỗi tương tự một vài tuần trở lại và giờ lãng phí với nó. Như bạn đã tìm thấy, giải pháp chỉ để bao gồm điều này:

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

cung cấp ma thuật cần thiết cho Qi sử dụng std :: pair làm đầu ra của quy tắc.

Tôi chủ yếu để lại câu trả lời ở đây chỉ vì vậy câu hỏi không còn hiển thị là chưa được trả lời - nếu bạn muốn thêm/chấp nhận câu trả lời của riêng mình, tôi sẽ rút lại điều này.

+0

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

+0

@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

+0

@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