|
Boost : |
From: Tobias Schwinger (tschwinger_at_[hidden])
Date: 2006-01-17 10:25:00
Arkadiy Vertleyb wrote:
> "Tobias Schwinger" <tschwinger_at_[hidden]> wrote
>>
>> test.cpp(77) : error C2784: 'boost::spirit::positive<S> boost::spirit::operator
>> +(const boost::spirit::parser<DerivedT> &)' : could not deduce template argument
>> for 'const boost::spirit::parser<DerivedT> &' from 'T'
>
>
> What's T?
/I/ don't know what T really is (MSVC won't tell me) ;-).
T /should/ be:
action<anychar_parser, void(*)(char const *, char const *)>
where
template<class P, typename A> class action<P,A>
is derived from
parser< action<P,A> >
however.
> There seem to be a number of contexts when some types can't be
> bound to const T&. For example VC71 can't do it from inside the template
> when T is a function (see currently failig typeof test).
I had a look at the 'function_ptr_from_tpl' test and instantly changed my code to
use a functor instead of a function pointer -- with best hopes but a bad feeling
because I thought I'd tried it before...
Most unfortunately the function pointer is not the problem, here.
Same problem, except that T should now be:
action<anychar_parser, functor>
...and MSVC still won't tell us ;-).
Thanks anyway,
Tobias
#include <boost/spirit/core.hpp>
#include <boost/typeof/typeof.hpp>
#include BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP()
BOOST_TYPEOF_REGISTER_TYPE(boost::spirit::anychar_parser)
BOOST_TYPEOF_REGISTER_TEMPLATE(boost::spirit::action, 2)
BOOST_TYPEOF_REGISTER_TEMPLATE(boost::spirit::positive, 1)
#define an_expression +anychar_p[ a_placeholder ]
struct functor
{
void operator()(char const * from, char const * to) const
{
// [...]
}
};
BOOST_TYPEOF_REGISTER_TYPE(functor)
#ifndef MAKE_THINGS_FAIL
using boost::spirit::anychar_p;
class a_rule_parser
: boost::spirit::parser<a_rule_parser>
{
functor a_placeholder;
struct __rule
{
// hide the placeholder member variable of the outer class with a static
// variable of the same type
static functor & a_placeholder;
typedef BOOST_TYPEOF( an_expression ) type;
};
__rule::type __expr;
public:
a_rule_parser(functor placeholder)
: a_placeholder( placeholder )
, __expr( an_expression )
{ }
// [...] (it's stripped down code to show a bug)
};
int main()
{
functor f;
a_rule_parser x(f);
return 0;
}
// so far, so good...
#else
// ...but the same code in templated form makes msvc8 do strange things
// using boost::spirit::anychar_p;
using namespace boost::spirit;
// ADL doesn't seem to work, either but I could live with this problem ;-)
template<typename T>
class a_rule_parser_template
: boost::spirit::parser< a_rule_parser_template<T> >
{
T a_placeholder;
struct __rule
{
// hide the placeholder member variable of the outer class with a static
// variable of the same type
static T & a_placeholder;
typedef BOOST_TYPEOF_TPL( an_expression ) type;
};
typename __rule::type __expr;
public:
a_rule_parser_template(T const & placeholder)
: a_placeholder( placeholder )
, __expr( an_expression )
{ }
// [...] (it's stripped down code to show a bug)
};
int main()
{
functor f;
a_rule_parser_template<functor> x(f);
return 0;
}
#endif
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk