Error de compilación con un impulso :: analizador de espíritu

Tengo un problema extraño con una calculadora hecha con boost :: spirit. Se supone que esta calculadora toma una cadena como argumento que representa una serie de expresiones aritméticas separadas por comas, como "a + 4 * 5,77, (b-c) * 4". También permite la cadena "?" y devuelve la matriz que contiene un -1 en este caso. La calculadora se inicializa con una SymTable, que es un argumento de clase de plantilla para describir cualquier clase que ofrezca el operador [string] -> int (ejemplo: un mapa), para resolver el valor de las variables.

El siguiente código funciona en mi Ubuntu 10.4 con gcc 4.6.2 y gcc 4.4, y ambos aumentan 1.47 y 1.48. También funcionó en el pasado en una máquina Cray Linux con gcc 4.5.3 y 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 % ',');
        }
};

}

Hoy intenté nuevamente compilar el mismo código en la máquina Cray (que se ha actualizado desde entonces, creo), probé con gcc 4.6.2 y gcc 4.5.2, y ambos con boost 1.48 y 1.49, y siempre obtengo el mismo error de compilación que no entiendo:

/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'

La línea 74 en Calc.hpp corresponde a la línea "factor = ...". La línea de instanciación indicada (MetadataManager.cpp: 45) es la siguiente:

layoutInterp = new Calc<std::string::const_iterator,ParameterSet>(*parameters);

with layoutInterp es de tipo Calc * y los parámetros son de tipo ParameterSet *.

¿Alguna idea de dónde viene este error? Gracia

Respuestas a la pregunta(2)

Su respuesta a la pregunta