[iterator + program_options] borland problem

Hello, one of program_options' iterators no longer work on borland 5.6.4. The iterator is defined like: class environment_iterator : public eof_iterator<environment_iterator, std::pair<std::string, std::string> > Where eof_iterator is define like this: template<class Derived, class ValueType> class eof_iterator : public iterator_facade<Derived, const ValueType, forward_traversal_tag> So, the ValueType passed to iterator_facade is const std::pair<string, string>. The error produced by Borland is: Error E2034 C:\Users\Administrator\boost\main\boost\boost/iterator/iterator_facade.hpp 326: Cannot convert 'const pair<string,string> *' to 'pair<string,string> *' in function operator_arrow_result<pair<string,string>,const pair<string,string> &,pair<string,string> *>::make(const pair<string,string> &) Error E2342 C:\Users\Administrator\boost\main\boost\boost/iterator/iterator_facade.hpp 326: Type mismatch in parameter 'x' (wanted 'pair<string,string> *', got 'const pair<string,string> *') in function operator_arrow_result<pair<string,string>,const pair<string,string> &,pair<string,string> *>::make(const pair<string,string> &) It happens when instantiating this class. template <class ValueType, class Reference, class Pointer> struct operator_arrow_result { On borland, non-const type is passed as Pointer, which leads to the problem. Looks like the logic which computes the ::reference type confuses borland. On gcc, const type is passed as Pointer. The attached patch fixes the problem, by replacing add_const<value_type>::type with const value_type I haven't used #ifdef, because I think that the change should work on other compilers, too. At least it does not break any iterator tests with gcc. Comments? - Volodya
participants (1)
-
Vladimir Prus