使用boost :: spirit製作的計算器有一個奇怪的問題。這個計算器應該把一個字符串作爲參數來表示由逗號分隔的一系列算術表達式,如「a + 4 * 5,77,(b-c)* 4」。它也允許字符串「?」並在這種情況下返回包含-1的數組。該計算器使用SymTable進行初始化,SymTable是一個模板類參數,用於描述提供[string] - > int運算符的任何類(例如:地圖),以解析變量的值。使用boost :: spirit解析器編譯錯誤
下面的代碼可以在我的Ubuntu 10.4上使用gcc 4.6.2和gcc 4.4,並且都可以提升1.47和1.48。它也曾在Cray Linux機器上使用gcc 4.5.3和boost 1.47。
#include <boost/bind.hpp>
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/phoenix_core.hpp>
#include <boost/spirit/include/phoenix_operator.hpp>
namespace sp = boost::spirit;
namespace qi = boost::spirit::qi;
namespace ascii = boost::spirit::ascii;
namespace Damaris {
template <typename Iterator, typename SymTable>
struct Calc : qi::grammar<Iterator, std::vector<int>(), ascii::space_type>
{
qi::rule<Iterator, std::vector<int>(), ascii::space_type> start;
qi::rule<Iterator, int(), ascii::space_type> expr;
qi::rule<Iterator, int(), ascii::space_type> qmark;
qi::rule<Iterator, int(), ascii::space_type> factor;
qi::rule<Iterator, int(), ascii::space_type> simple;
qi::rule<Iterator, std::string(), ascii::space_type> identifier;
qi::rule<Iterator, int(SymTable), ascii::space_type> value;
/**
* \brief Constructor.
* \param[in] sym : table of symboles.
*/
Calc(SymTable &sym) : Calc::base_type(start)
{
identifier = qi::lexeme[(qi::alpha | '_') >> *(qi::alnum | '_')];
value = identifier[qi::_val = qi::labels::_r1[qi::_1]];
simple = ('(' >> expr >> ')')
| qi::int_
| value(boost::phoenix::ref(sym));
factor %= (simple >> '*' >> factor)[qi::_val = qi::_1 * qi::_2]
| (simple >> '/' >> factor)[qi::_val = qi::_1/qi::_2]
| (simple >> '%' >> factor)[qi::_val = qi::_1 % qi::_2]
| simple;
expr %= (factor >> '+' >> expr)[qi::_val = qi::_1 + qi::_2]
| (factor >> '-' >> expr)[qi::_val = qi::_1 - qi::_2]
| factor;
qmark = qi::char_('?')[qi::_val = -1];
start = qmark
| (expr % ',');
}
};
}
今天,我再次嘗試編譯克雷機上相同的代碼(此後至今已進行了升級,我認爲),我嘗試用gcc 4.6.2和gcc 4.5.2,並都與提升1.48和1.49,而且我總是得到相同的編譯錯誤,我不明白:
/nics/b/home/mdorier/damaris-0.4/common/Calc.hpp:74:3: instantiated from 'Damaris::Calc<Iterator, SymTable>::Calc(SymTable&) [with Iterator = __gnu_cxx::__normal_iterator<const char*, std::basic_string<char> >, SymTable = Damaris::ParameterSet]'
/nics/b/home/mdorier/damaris-0.4/common/MetadataManager.cpp:45:79: instantiated from here
/nics/b/home/mdorier/deploy/include/boost/spirit/home/qi/detail/assign_to.hpp:123:13: error: invalid static_cast from type 'const boost::fusion::vector2<int, int>' to type 'int'
Calc.hpp中的第74行對應「factor = ...」行。 指示(MetadataManager.cpp:45)實例化線如下:
layoutInterp = new Calc<std::string::const_iterator,ParameterSet>(*parameters);
與layoutInterp是類型計算值*的和參數爲類型PARAMETERSET的*。
任何想法,這個錯誤來自哪裏?謝謝
包括[答到生命,宇宙和萬物的終極問題(http://en.wikipedia.org/維基/ Phrases_from_The_Hitchhiker's_Guide_to_the_Galaxy#Answer_to_the_Ultimate_Question_of_Life.2C_the_Universe.2C_and_Everything_.2842.29) – sehe 2012-02-26 23:25:01