2012-03-18 4 views
2

私はブーストセマンティックアクションを使用しようとしました。私の場合、boost::bindが最も簡単な解決策でした。最初の例はうまくいきます。ここで私はセマンティックアクションで1つの引数だけを使用しています。ブースト::バインドを使用するとboost :: spirit :: qiセマンティックアクションが2つの引数で動作しないのはなぜですか?

#include <boost/config/warning_disable.hpp> 
#include <boost/spirit/include/qi.hpp> 
#include <boost/bind.hpp> 
#include <iostream> 
namespace qi = boost::spirit::qi; 

// A plain function 
void print(int const& i) 
{ 
    std::cout << i << std::endl; 
} 

int main() 
{ 
    using boost::spirit::qi::int_; 
    using boost::spirit::qi::parse; 

    char const *first = "{44}", *last = first + std::strlen(first); 
    parse(first, last, '{' >> int_[boost::bind(&print, _1)] >> '}'); 

    return 0; 
} 

私のコードを拡張しようとしました。後者の場合、バインドされた関数に2つの引数を渡したいが、コンパイラはこのコードをコンパイルしない。何が失敗するのですか?私は例を見いださなかった。 第二のコードはここにある:一つだけの入力パラメータがありますので

#include <boost/config/warning_disable.hpp> 
#include <boost/spirit/include/qi.hpp> 
#include <boost/bind.hpp> 
#include <iostream> 
namespace qi = boost::spirit::qi; 

// A plain function 
void print(int const& i1, int const& i2) 
{ 
    std::cout << i1 << "," << i2 << std::endl; 
} 

int main() 
{ 
    using boost::spirit::qi::int_; 
    using boost::spirit::qi::parse; 

    char const *first = "{44,55}", *last = first + std::strlen(first); 
    parse(first, last, '{' >> (int_ >> "," >> int_)[boost::bind(&print, _1,_2)] >> '}'); 

    return 0; 
} 

答えて

2

あなたはこのコードをコンパイルすることはできません - 後押し::融合を::ベクトル<のint、int型> - (INT_によって形成された>>「」> > int_)シーケンス。試してみてください

#include <boost/config/warning_disable.hpp> 
#include <boost/spirit/include/qi.hpp> 
#include <boost/bind.hpp> 
#include <iostream> 
namespace qi = boost::spirit::qi; 

// A plain function 
void print(boost::fusion::vector < int, int > arg_) 
{ 
    std::cout << boost::fusion::at_c <0> (arg_) << "," << boost::fusion::at_c <1> (arg_) << std::endl; 
} 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    using boost::spirit::qi::int_; 
    using boost::spirit::qi::parse; 

    char const *first = "{44,55}", *last = first + std::strlen(first); 
    parse(first, last, '{' >> (int_ >> "," >> int_)[boost::bind(&print, _1)] >> '}'); 

    return 0; 
}