Hi,
I get a compiler error (cannot convert from 'const phoenix::nil_t' to
'int') when using arg2 of a two value closure. arg1 works fine, but not
arg2. I don't understand what I have done wrong.
Visual Studio 2005 SP1
boost 1.36.0
Anyone got any ideas?
Best regards,
Anders Dalvander
Output:
Compiling...
SpiritClosureTest.cpp
d:\prog\boost_1_36_0\boost\spirit\home\classic\phoenix\operators.hpp(446)
: error C2440: '=' : cannot convert from 'const phoenix::nil_t' to 'int'
No user-defined-conversion operator available that can perform
this conversion, or the operator cannot be called
d:\prog\boost_1_36_0\boost\spirit\home\classic\phoenix\operators.hpp(446)
: while compiling class template member function 'int
&phoenix::binary_operator::eval(T0 &,const T1 &)'
with
[
TagT=phoenix::assign_op,
T0=int,
T1=phoenix::nil_t
]
d:\prog\boost_1_36_0\boost\spirit\home\classic\phoenix\operators.hpp(1017)
: see reference to class template instantiation
'phoenix::binary_operator' being compiled
with
[
TagT=phoenix::assign_op,
T0=int,
T1=phoenix::nil_t
]
d:\prog\boost_1_36_0\boost\spirit\home\classic\phoenix\composite.hpp(237)
: see reference to class template instantiation
'phoenix::assign_op::result' being compiled
with
[
T0=int,
T1=phoenix::nil_t
]
d:\prog\boost_1_36_0\boost\spirit\home\classic\phoenix\composite.hpp(267)
: see reference to class template instantiation
'phoenix::composite2_result' being compiled
with
[
OperationT=phoenix::assign_op,
TupleT=phoenix::tuple<>,
A=phoenix::actor>>,
B=phoenix::actor>
]
d:\prog\boost_1_36_0\boost\spirit\home\classic\phoenix\actor.hpp(122) :
see reference to class template instantiation
'phoenix::composite::result<TupleT>' being compiled
with
[
OperationT=phoenix::assign_op,
A=phoenix::actor>>,
B=phoenix::actor>,
C=phoenix::as_actorphoenix::nil_t::type,
TupleT=phoenix::tuple<>
]
d:\prog\boost_1_36_0\boost\spirit\home\classic\phoenix\actor.hpp(133) :
see reference to class template instantiation
'phoenix::actor_result' being compiled
with
[
ActorT=phoenix::composite>>,phoenix::actor>,phoenix::as_actorphoenix::nil_t::type>,
TupleT=phoenix::tuple<>
]
c:\documents and settings\anders\my documents\visual studio
2005\projects\spiritclosuretest\spiritclosuretest\spiritclosuretest.cpp(25)
: see reference to class template instantiation 'phoenix::actor<BaseT>'
being compiled
with
[
BaseT=phoenix::composite>>,phoenix::actor>,phoenix::as_actorphoenix::nil_t::type>
]
c:\documents and settings\anders\my documents\visual studio
2005\projects\spiritclosuretest\spiritclosuretest\spiritclosuretest.cpp(16)
: while compiling class template member function
'my_grammar::definition<ScannerT>::definition(const my_grammar &)'
with
[
ScannerT=boost::spirit::scanner<>
]
d:\prog\boost_1_36_0\boost\spirit\home\classic\core\non_terminal\impl\grammar.ipp(279)
: see reference to class template instantiation
'my_grammar::definition<ScannerT>' being compiled
with
[
ScannerT=boost::spirit::scanner<>
]
d:\prog\boost_1_36_0\boost\spirit\home\classic\core\non_terminal\impl\grammar.ipp(298)
: see reference to function template instantiation 'void
boost::spirit::impl::call_helper<0>::do_(RT
&,DefinitionT &,const ScannerT &)' being compiled
with
[
ScannerT=boost::spirit::scanner<>,
RT=result_t,
DefinitionT=definition_t
]
d:\prog\boost_1_36_0\boost\spirit\home\classic\core\non_terminal\grammar.hpp(55)
: see reference to function template instantiation
'boost::spirit::matchboost::spirit::nil_t
boost::spirit::impl::grammar_parser_parse<0,my_grammar,boost::spirit::parser_context<>,ScannerT>(const
boost::spirit::grammar<DerivedT> *,const ScannerT &)' being compiled
with
[
ScannerT=boost::spirit::scanner<>,
DerivedT=my_grammar
]
d:\prog\boost_1_36_0\boost\spirit\home\classic\core\non_terminal\grammar.hpp(65)
: see reference to function template instantiation
'boost::spirit::matchboost::spirit::nil_t
boost::spirit::grammar<DerivedT>::parse_main<ScannerT>(const ScannerT &)
const' being compiled
with
[
DerivedT=my_grammar,
ScannerT=boost::spirit::scanner<>
]
d:\prog\boost_1_36_0\boost\spirit\home\classic\core\impl\parser.ipp(30)
: see reference to function template instantiation
'boost::spirit::matchboost::spirit::nil_t
boost::spirit::grammar<DerivedT>::parse>(const
ScannerT &) const' being compiled
with
[
DerivedT=my_grammar,
ScannerT=boost::spirit::scanner<>
]
d:\prog\boost_1_36_0\boost\spirit\home\classic\core\impl\parser.ipp(47)
: see reference to function template instantiation
'boost::spirit::parse_info<IteratorT> boost::spirit::parse(const IteratorT &,const IteratorT &,const
boost::spirit::parser<DerivedT> &)' being compiled
with
[
IteratorT=const char *,
CharT=char,
DerivedT=my_grammar
]
c:\documents and settings\anders\my documents\visual studio
2005\projects\spiritclosuretest\spiritclosuretest\spiritclosuretest.cpp(54)
: see reference to function template instantiation
'boost::spirit::parse_info<IteratorT>
boost::spirit::parse(const CharT *,const
boost::spirit::parser<DerivedT> &)' being compiled
with
[
IteratorT=const char *,
DerivedT=my_grammar,
CharT=char
]
Source:
#include
#include
#include <iostream>
struct result_closure : boost::spirit::closure
{
member1 res1;
member2 res2;
};
struct my_grammar : boost::spirit::grammar
{
template <typename ScannerT>
struct definition
{
explicit definition(const my_grammar& self)
{
using boost::spirit::ch_p;
using boost::spirit::uint_p;
using phoenix::var;
using phoenix::arg1;
using phoenix::arg2;
exp
= uint_p[exp.res1 = arg1] >> ch_p('-') >> uint_p[exp.res2 =
arg1]
;
root
= exp[var(self.i) = arg2] // compiler error here if using arg2.
; // arg1 works fine though.
}
boost::spirit::rule exp;
boost::spirit::rule<ScannerT> root;
const boost::spirit::rule<ScannerT>& start() const
{
return root;
}
};
my_grammar(int& i_)
: i(i_)
{
}
int& i;
};
int main()
{
int i;
my_grammar g(i);
if (parse("1-2", g).full)
{
std::cout << i << "\n";
}
}