При написании пользовательского типа итератора я решил, что хочу иметь возможность преобразовывать константные итераторы в неконстантные итераторы. Я написал следующую remove_const
функцию. По какой-то причине компилятор не может сделать вывод, что const P
совпадает с const int*
. Ошибка, которую я получаю из GCC 8.2: types 'const P' and 'const int*' have incompatible cv-qualifiers
.
Есть ли в моем коде что-то, что мешает компилятору правильно выводить? Кроме того, если есть лучший способ делать то, что я хочу, я бы хотел знать.
template <int, typename P>
struct my_iterator { P ptr; };
using iterator = my_iterator<3, int*>;
using const_iterator = my_iterator<3, const int*>;
template <int I, typename P>
my_iterator<I, P> remove_const(my_iterator<I, const P> it) {
return my_iterator<I, P>{ const_cast<P>(it.ptr) };
}
int main() {
const_iterator it{ nullptr };
remove_const( it );
return 0;
}
Вот ссылка Годболта с кодом