Go back to Richel Bilderbeek's homepage.

Go back to Richel Bilderbeek's C++ page.

 

 

 

 

 

(C++) Answer of exercise #8: Library trouble #0

 

This is the answer of Exercise #8: library trouble.

 

The compiler takes you to the following code:

 

// search_n. Search for __count consecutive copies of __val.

template <class _ForwardIter, class _Integer, class _Tp>
  _ForwardIter search_n(_ForwardIter __first, _ForwardIter __last,
  _Integer __count, const _Tp& __val) {
  _STLP_DEBUG_CHECK(__check_range(__first, __last))
  if (__count <= 0)
    return __first;
  else {
    __first = find(__first, __last, __val);
    while (__first != __last) {
      _Integer __n = __count - 1;
      _ForwardIter __i = __first;
      ++__i;
      while (__i != __last && __n != 0 && *__i == __val) {
        ++__i;
        --__n; // <---- THIS LINE
      }
      if (__n == 0)
        return __first;
      else
        __first = find(__i, __last, __val);
      }
    return __last;
  }
}

 

This must means that __n is also a const data type. This is true, as shown below:

 

// search_n. Search for __count consecutive copies of __val.

template <class _ForwardIter, class /*non-const*/ _Integer, class _Tp>
  _ForwardIter search_n(_ForwardIter __first, _ForwardIter __last,
  /*non-const*/ _Integer __count, const _Tp& __val) {
  _STLP_DEBUG_CHECK(__check_range(__first, __last))
  if (__count <= 0)
    return __first;
  else {
    __first = find(__first, __last, __val);
    while (__first != __last) {
      /*non-const*/ _Integer __n = __count - 1;
      _ForwardIter __i = __first;
      ++__i;
      while (__i != __last && __n != 0 && *__i == __val) {
        ++__i;
        --__n; // <---- THIS LINE
      }
      if (__n == 0)
        return __first;
      else
        __first = find(__i, __last, __val);
      }
    return __last;
  }
}

 

So, due to the template use, __n will be of type const int, when we pass a __count of type const int! This conflict with the use of __n as a changing index. The type of __n should be the non-const type of __count.

 

 

 

 

 

Go back to Richel Bilderbeek's C++ page.

Go back to Richel Bilderbeek's homepage.

 

Valid XHTML 1.0 Strict