저는 vc14를 사용하고 부스트 버전은 1.60입니다.boost :: bind (멤버 함수)에서 문맥 인수에서의 정신 파서 액션에서 컴파일 오류가 발생했습니다.
#include <boost/config/warning_disable.hpp>
#include <boost\spirit\home\qi.hpp>
#include <boost\variant.hpp>
#include <boost\spirit\include\qi.hpp>
#include <boost\spirit\include\phoenix_core.hpp>
#include <boost\spirit\include\phoenix_operator.hpp>
#include <boost\spirit\include\phoenix_object.hpp>
#include <boost/phoenix/function/adapt_function.hpp>
#include <boost\spirit\include\phoenix_fusion.hpp>
#include <boost\foreach.hpp>
#include <string>
#include <list>
#include <boost\bind.hpp>
#define BOOST_SPIRIT_USE_PHOENIX_V3
namespace testParser {
namespace qi = boost::spirit::qi;
namespace ascii = boost::spirit::ascii;
namespace sp = boost::spirit;
namespace fu = boost::fusion;
typedef sp::context<
fu::cons<std::list<std::string>,fu::nil >,
fu::vector0<>
> context;
class str_menager
{
qi::symbols<char> const& vistrings;
public:
typedef void result_type;
typedef void type;
str_menager(qi::symbols<char> const& ss) :vistrings(ss) { }
void operator()(std::string const& s, context& con, bool& m_Flag)
{
if (vistrings.find(s) != nullptr)
{
using boost::phoenix::at_c;
(fu::at_c<0>(con.attributes)).push_back(s);
}
else
{
m_Flag = false;
}
}
void decide(std::string const& s,
// boost::spirit::qi::unused_type ,
context& con,
bool& m_Flag)
{
if (vistrings.find(s) != nullptr)
{
using boost::phoenix::at_c;
(fu::at_c<0>(con.attributes)).push_back(s);
}
else
{
m_Flag = false;
}
}
};
typedef std::list<std::string> strings;
template <typename iterator, typename Skiper = ascii::space_type>
struct stringParser :qi::grammar <iterator, strings(), Skiper>
{
stringParser() : stringParser::base_type(stringslist) {
using boost::phoenix::at_c;
using boost::spirit::qi::_val;
using boost::spirit::qi::int_;
using boost::spirit::qi::omit;
using boost::spirit::qi::lexeme;
using boost::spirit::ascii::alpha;
using boost::spirit::qi::raw;
using boost::spirit::qi::fail;
using boost::spirit::_pass;
using boost::spirit::false_;
using boost::spirit::qi::on_error;
using boost::phoenix::val;
using boost::phoenix::construct;
using boost::phoenix::ref;
using boost::spirit::hold;
str_menager controler(vistrings);
name = raw[lexeme[*alpha]];
stringslist =
*(
omit[("VIS" > name)[ref(vistrings) += qi::_1]
] |
//hold[
name
//] > vistrings
[boost::bind(&str_menager::decide, &controler, _1, _2, _3)]
)
;
name.name("some_name");
stringslist.name("stringslist");
on_error<fail>
(stringslist,
std::cout << val("Error! Expectiong ")
<< qi::_4
<< val(" here: \"")
<< construct<std::string>(qi::_3, qi::_2)
<< val("\"")
<< std::endl);
}
qi::symbols<char> vistrings;
qi::rule<iterator, strings(), ascii::space_type> stringslist;
qi::rule<iterator, std::string(), ascii::space_type> name;
};
}
void TestSS()
{
std::string str = " VIS someString someString otherString";
typedef std::string::const_iterator iterator_type;
typedef testParser::stringParser<iterator_type> stringParser;
stringParser strParser;
iterator_type end = str.end();
iterator_type iter = str.begin();
testParser::strings strings;
int i = 0;
boost::spirit::ascii::space_type sp;
bool r = boost::spirit::qi::phrase_parse(iter, end, strParser, sp, strings);
BOOST_FOREACH(std::string const& p, strings)
{
std::cout << p << "\n";
}
std::cout << "\n";
}
컴파일러 오류 :
Error C2664 'void boost::_mfi::mf3<void,testParser::str_menager,const std::string &,testParser::context &,bool &>::operator()(T *,A1,A2,A3) const': cannot convert argument 3 from
'boost::spirit::context<boost::fusion::cons<std::list<std::string,std::allocator<_Ty>> ,boost::fusion::nil_>,boost::fusion::vector0<void>>' to
'boost::spirit::context<boost::fusion::cons<std::list<std::string,std::allocator<_Ty>>,boost::fusion::nil>,boost::fusion::vector0<void>> '
나는 '보류'지시어를 사용하여 원하는 것을 얻을 수있는 방법을 찾았지만 상황은하지 않습니다와 나는 부스트 :: 바인드와 방식으로 코드를 모르는 엮다. 나는 phoenix 사용법에 대한 해결책을 공개하고 있습니다. 당신의 decide
멤버 함수의 본문을 보면
참고로, 부스트 : bind'을 C++ (11) –
내가 사용했던 표준 : 바인드 이후 (str_menager'사용하는 이유가 결코 : 그리고 즉, 매개 변수로 직접
vistring
을 전달합니다 : 결정 및 제어, std :: 자리 표시 자 :: _ 1, std :: placeholders :: _ 2, std :: placeholders :: _ 3) '오류 C2338 : 튜플 인덱스가 범위를 벗어났습니다.'여전히 작동하지 않습니다. –@typetraitor 항의 하겠지만 분명히 올바른 것입니다. . 그러나 [std :: bind'] (http://melpon.org/wandbox/permlink/hROWxOiDpiLhwVjX)는 C++ 14 이전에 람다를 사용할 수 없다는 것을 허용합니다. – llonesmiz