Go back to Richel Bilderbeek's homepage.
Go back to Richel Bilderbeek's C++ page.
Compile error.
Full error message
[C++ Error] _algo.c(151): E2024 Cannot modify a const object
|
The compiler takes you to the following line in _algo.c:
// 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;
}
}
|
Cause
IDE: C++ Builder 6.0
Compiler: Borland BCC32.EXE version 6.0.10.157
Project type: Console Application
Solution/workaround
Remove the const of the int for the number of repeats, by static_casting it in the function call.
Note that a const_cast does not work. Personally, I would find this more appropriate, but I do not understand why this keeps giving the same error.
In-depth cause and better solution for advanced programmers
The actual problem is in _algo.c. I have made all relevant information strong:
// 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;
}
if (__n == 0)
return __first;
else
__first = find(__i, __last, __val);
}
return __last;
}
}
|
Because _Integer is a template type, the constness of the __count argument is also taken into account. The local _Integer __n, however, must not be const.
A better solution would be to make __n of non-const __integer type, so the user can write const-correct code.
Go back to Richel Bilderbeek's C++ page.
Go back to Richel Bilderbeek's homepage.
