I want use Boost.Spirit.Lex to lex a binary file; for this purpose I wrote the following program (here is an extract):
#include <boost/spirit/include/lex_lexertl.hpp>
#include <boost/spirit/include/support_multi_pass.hpp>
#include <boost/bind.hpp>
#include <boost/ref.hpp>
#include <fstream>
#include <iterator>
#include <string>
namespace spirit = boost::spirit;
namespace lex = spirit::lex;
#define X 1
#define Y 2
#define Z 3
template<typename L>
class word_count_tokens : public lex::lexer<L>
{
    public:
        word_count_tokens () {
            this->self.add
                ("[^ \t\n]+", X)
                ("\n", Y)
                (".", Z);
        }
};
class counter
{
    public:
        typedef bool result_type;
        template<typename T>
        bool operator () (const T &t, size_t &c, size_t &w, size_t &l) const {
            switch (t.id ()) {
               case X:
                   ++w; c += t.value ().size ();
                    break;
               case Y:
                   ++l; ++c;
                    break;
                case Z:
                    ++c;
                    break;
            }
            return true;
        }
};
int main (int argc, char **argv)
{
    std::ifstream ifs (argv[1], std::ios::in | std::ios::binary);
    auto first = spirit::make_default_multi_pass (std::istream_iterator<char> (ifs));
    auto last = spirit::make_default_multi_pass (std::istream_iterator<char> ());
    size_t w, c, l;
    word_count_tokens<lex::lexertl::lexer<>> word_count_functor;
    w = c = l = 0;
    bool r = lex::tokenize (first, last, word_count_functor, boost::bind (counter (), _1, boost::ref (c), boost::ref (w), boost::ref (l)));
    ifs.close ();
    if (r) {
        std::cout << l << ", " << w << ", " << c << std::endl;
    }
    return 0;
}
The build returns the following error:
lexer.hpp:390:46: error: non-const lvalue reference to type 'const char *' cannot bind to a value of unrelated type
Now, the error is due to definition of concrete lexer, lex::lexer<>; in fact its first parameter is defaulted to const char *. I obtain the same error also if I use spirit::istream_iterator or spirit::make_default_multi_pass (.....).
But if I specify the correct template parameters of lex::lexer<> I obtain a plethora of errors!  
Solutions?
Update
I have putted all source file; it's the word_counter site's example.
I think the real problem is not shown. You don't show first or last and I have a feeling you might have temporaries there.
Here's a sample I came up with to verify, perhaps you can see what it is you're doing ---wrong--- differently :)
const char*)spirit::istream_iterator)#include <boost/spirit/include/lex_lexertl.hpp>
#include <boost/spirit/include/qi.hpp>
#include <fstream>
#ifdef MEMORY_MAPPED
#   include <boost/iostreams/device/mapped_file.hpp>
#endif
namespace /*anon*/
{
    namespace qi =boost::spirit::qi;
    namespace lex=boost::spirit::lex;
    template <typename Lexer>
        struct mylexer_t : lex::lexer<Lexer>
    {
        mylexer_t()
        {
            fileheader = "hello";
            this->self = fileheader
                | space [ lex::_pass = lex::pass_flags::pass_ignore ];
        }
        lex::token_def<lex::omit>
            fileheader, space;
    };
    template <typename Iterator> struct my_grammar_t
        : public qi::grammar<Iterator>
    {
        template <typename TokenDef>
            my_grammar_t(TokenDef const& tok) 
                : my_grammar_t::base_type(header)
        {
            header = tok.fileheader;
            BOOST_SPIRIT_DEBUG_NODE(header);
        }
      private:
        qi::rule<Iterator> header;
    };
}
namespace /* */ {
    std::string safechar(char ch) {
        switch (ch) {
            case '\t': return "\\t"; break;
            case '\0': return "\\0"; break;
            case '\r': return "\\r"; break;
            case '\n': return "\\n"; break;
        }
        return std::string(1, ch); 
    }
    template <typename It>
        std::string showtoken(const boost::iterator_range<It>& range)
        {
            std::ostringstream oss;
            oss << '[';
            std::transform(range.begin(), range.end(), std::ostream_iterator<std::string>(oss), safechar);
            oss << ']';
            return oss.str();
        }
}
bool parsefile(const std::string& spec)
{
#ifdef MEMORY_MAPPED
    typedef char const* It;
    boost::iostreams::mapped_file mmap(spec.c_str(), boost::iostreams::mapped_file::readonly);
    char const *first = mmap.const_data();
    char const *last = first + mmap.size();
#else
    typedef char const* It;
    std::ifstream in(spec.c_str());
    in.unsetf(std::ios::skipws);
    std::string v(std::istreambuf_iterator<char>(in.rdbuf()), std::istreambuf_iterator<char>());
    It first = &v[0];
    It last = first+v.size();
#endif
    typedef lex::lexertl::token<It  /*, boost::mpl::vector<char, unsigned int, std::string> */> token_type;
    typedef lex::lexertl::actor_lexer<token_type> lexer_type;
    typedef mylexer_t<lexer_type>::iterator_type iterator_type;
    try
    {
        static mylexer_t<lexer_type> mylexer;
        static my_grammar_t<iterator_type> parser(mylexer);
        auto iter = mylexer.begin(first, last);
        auto end  = mylexer.end();
        bool r = qi::parse(iter, end, parser);
        r = r && (iter == end);
        if (!r)
            std::cerr << spec << ": parsing failed at: \"" << std::string(first, last) << "\"\n";
        return r;
    }
    catch (const qi::expectation_failure<iterator_type>& e)
    {
        std::cerr << "FIXME: expected " << e.what_ << ", got '";
        for (auto it=e.first; it!=e.last; it++)
            std::cerr << showtoken(it->value());
        std::cerr << "'" << std::endl;
        return false;
    }
}
int main()
{
    if (parsefile("input.bin"))
        return 0;
    return 1;
}
For the variant:
typedef boost::spirit::istream_iterator It;
std::ifstream in(spec.c_str());
in.unsetf(std::ios::skipws);
It first(in), last;
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With