Implicit typename error
While compiling some code with gcc (that had previously compiled and run without complaint under CodeWarrior), the following warning was reported:
SblNumerics.h:334: warning: 'typename std::iterator_traits<_Iterator>::value_type' is implicitly a typename SblNumerics.h:334: warning: implicit typename is deprecated, please see the documentation for details
The offending code looks like this:
template <class Iter> inline iterator_traits<InputIter>::value_type sum (Iter first, Iter last, iterator_traits<Iter>::value_type init) { ... }
or this:
template <typename X> class SimpleMatrix : public std::vector<std::vector<X> > { public: // PUBLIC TYPE INTERFACE typedef std::vector<X> row_type; typedef std::vector<row_type> base_type; typedef row_type::size_type size_type; // error here ... typedef row_type::reference reference; // ... and here .... typedef row_type::const_reference const_reference; // ... and here ... }
The problem here is that when a compiler encounters something like classname::something, it has to decide whether this is a member variable, member function, or name of a type declared inside the class (e.g. a typedef or nested class). In the case of dependent names (ones that depend on a template parameter) this is easy. Often, compilers assume it is a type name - which would be correct in this case. However more recent compilers demand that you resolve this ambiguity. To get this warning to go away the type names must be explicitly identified as such:
template <class Iter> inline typename iterator_traits<Iter>::value_type sum (Iter first, Iter last, typename iterator_traits<Iter>::value_type init) { ... }
and as such:
template <typename X> class SimpleMatrix : public std::vector<std::vector<X> > { public: // PUBLIC TYPE INTERFACE typedef std::vector<X> row_type; typedef std::vector<row_type> base_type; typedef typename row_type::size_type size_type; // error here ... typedef typename row_type::reference reference; // ... and here .... typedef typename row_type::const_reference const_reference; // ... and here ... }
Why is it that every fix to a C++ program involves increasing the verbosity of the code?