2011-08-05 9 views
7

Estoy usando Boost :: Spirit para analizar texto en las estructuras. Esto requiere el uso de BOOST_FUSION_ADAPT_STRUCT para analizar el texto y almacenarlo directamente en la estructura. Sé que la macro toma 2 argumentos: el nombre de la estructura como el 1er arg y todos los miembros de la estructura como el segundo argumento. Y yo estoy pasando sólo a los 2. Pero consigo un error de compilación diciendoBOOST_FUSION_ADAPT_STRUCT no toma el número correcto de argumentos

error: macro "BOOST_FUSION_ADAPT_STRUCT_FILLER_0" passed 3 arguments, but takes just 2 

Aquí es el fragmento de código. Avíseme si necesita el código completo.

Gracias.

namespace client 
{ 
    namespace qi = boost::spirit::qi; 
    namespace ascii = boost::spirit::ascii; 
    namespace phoenix = boost::phoenix; 

    struct Dir_Entry_Pair 
    { 
     std::string     dir; 
     std::string     value1; 
     std::pair<std::string, std::string> keyw_value2; 
    }; 
} 

BOOST_FUSION_ADAPT_STRUCT(
    client::Dir_Entry_Pair, 
    (std::string, dir) 
    (std::string, value1) 
    (std::pair< std::string, std::string >, keyw_value2)) 

Ésta es la regla que estoy tratando de analizar,

qi::rule<Iterator, Dir_Entry_Pair()> ppair = dir 
               >> '/' 
               >> entry 
               >> -(keyword >> entry); 

Respuesta

10

más probable es que el problema es std::pair<std::string,std::string>.

El problema es que hay una coma en el tipo, que causará estragos en la expansión de macro (cuando se usa el último elemento de la lista).

Debe intentar ajustar el tipo en su propio conjunto de paréntesis.

+1

Gracias! Acabo de tipear el std :: par <..> y funcionó :) – Nik

+0

@Nik: es un problema común con las macros: generalmente aparece 'BOOST_FOREACH' sobre' map' que es ligeramente más común que la combinación Fusion/Spirit :) ¡Espero que te diviertas con ellos! –

Cuestiones relacionadas