A
Aaron Walker
Greetings,
I'm attempting to write my first *real* template function that also deals with
a map of strings to member function pointers that is making the syntax a little
tricky to get right.
The function in question:
36: template <typename Container,
37: typename OutputIterator,
38: typename UnaryOp>
39: void
40: transform_fields_into_matches(
41: typename Container::const_iterator first,
42: typename Container::const_iterator last,
43: OutputIterator result,
44: const fields_type& fields,
45: const std::map<std::string,
46: const std::string& (Container::value_type::*)(void) const > & fm,
47: UnaryOp op)
48: {
49: typedef const std::string& (Container::value_type::*mfp)(void) const;
50:
51: util::Regex criteria;
52: const int cflags(options::eregex() ?
53: util::Regex::extended|util::Regex::icase : util::Regex::icase);
54:
55: for (; first != last ; ++first)
56: {
57: fields_type::const_iterator f;
58: for (f = fields.begin() ; f != fields.end() ; ++f)
59: {
60: /* check if field is valid */
61: std::map<std::string, mfp>::const_iterator i = fm.find(f->first);
62: if (i == fm.end())
63: throw InvalidField(f->first);
64:
65: /* it's valid, so compile regex */
66: criteria.assign(f->second, cflags);
67:
68: /* compare criteria against the return value of the
69: * Container::value_type member function mapped to
70: * this field. */
71: const typename Container::value_type& v(*first);
72: if (criteria != (v.*(i->second))())
73: break;
74:
75: /* we're on the last field, meaning all fields that came before
76: * it also matched, so save it finally. */
77: if ((f+1) == fields.end())
78: *result++ = op(*first);
79: }
80: }
81: }
For some reason I can't figure out, the compile keeps bailing on line 61 with:
"error: expected ';' before i".
I'm thinking maybe it has something to do with the lack of 'typename' when
using Container::value_type in the function pointer, but adding that seems to
cause another problem (maybe I'm not putting it in the right place?)
using:
typedef const std::string& (typename Container::value_type::*mfp)(void) const;
causes:
error: expected unqualified-id before ‘typename’
error: expected `)' before ‘typename’
error: expected initializer before ‘typename’
Any pointers in the right direction?
Much appreciated,
Aaron
I'm attempting to write my first *real* template function that also deals with
a map of strings to member function pointers that is making the syntax a little
tricky to get right.
The function in question:
36: template <typename Container,
37: typename OutputIterator,
38: typename UnaryOp>
39: void
40: transform_fields_into_matches(
41: typename Container::const_iterator first,
42: typename Container::const_iterator last,
43: OutputIterator result,
44: const fields_type& fields,
45: const std::map<std::string,
46: const std::string& (Container::value_type::*)(void) const > & fm,
47: UnaryOp op)
48: {
49: typedef const std::string& (Container::value_type::*mfp)(void) const;
50:
51: util::Regex criteria;
52: const int cflags(options::eregex() ?
53: util::Regex::extended|util::Regex::icase : util::Regex::icase);
54:
55: for (; first != last ; ++first)
56: {
57: fields_type::const_iterator f;
58: for (f = fields.begin() ; f != fields.end() ; ++f)
59: {
60: /* check if field is valid */
61: std::map<std::string, mfp>::const_iterator i = fm.find(f->first);
62: if (i == fm.end())
63: throw InvalidField(f->first);
64:
65: /* it's valid, so compile regex */
66: criteria.assign(f->second, cflags);
67:
68: /* compare criteria against the return value of the
69: * Container::value_type member function mapped to
70: * this field. */
71: const typename Container::value_type& v(*first);
72: if (criteria != (v.*(i->second))())
73: break;
74:
75: /* we're on the last field, meaning all fields that came before
76: * it also matched, so save it finally. */
77: if ((f+1) == fields.end())
78: *result++ = op(*first);
79: }
80: }
81: }
For some reason I can't figure out, the compile keeps bailing on line 61 with:
"error: expected ';' before i".
I'm thinking maybe it has something to do with the lack of 'typename' when
using Container::value_type in the function pointer, but adding that seems to
cause another problem (maybe I'm not putting it in the right place?)
using:
typedef const std::string& (typename Container::value_type::*mfp)(void) const;
causes:
error: expected unqualified-id before ‘typename’
error: expected `)' before ‘typename’
error: expected initializer before ‘typename’
Any pointers in the right direction?
Much appreciated,
Aaron