передача итератора const в качестве аргумента » this’ отбрасывает квалификаторы при использовании vector::erase в шаблоне

#c #c 11 #templates #vector #iterator

Вопрос:

Я пытаюсь удалить первое значение вектора имен типов шаблонов. Используя метод erase() в векторном stl, я продолжаю получать эту ошибку:

 TTrie.inc:56:19: error: passing ‘const std::vector<char, std::allocator<char> >’ as ‘this’ argument discards qualifiers [-fpermissive]
   56 |     sequence.erase(it);
      |     ~~~~~~~~~~~~~~^~~~
In file included from /usr/include/c  /10/vector:67,
                 from TTrie.h:5,
                 from TTrieTest.cpp:1:
/usr/include/c  /10/bits/stl_vector.h:1430:7: note:   in call to ‘std::vector<_Tp, _Alloc>::iterator std::vector<_Tp, _Alloc>::erase(std::vector<_Tp, _Alloc>::const_iterator) [with _Tp = char; _Alloc = std::allocator<char>; std::vector<_Tp, _Alloc>::iterator = std::vector<char, std::allocator<char> >::iterator; std::vector<_Tp, _Alloc>::const_iterator = std::vector<char, std::allocator<char> >::const_iterator]’
 1430 |       erase(const_iterator __position)
      |       ^~~~~
In file included from TTrie.h:115,
                 from TTrieTest.cpp:1:
TTrie.inc: In instantiation of ‘TTrie<DataType>amp; TTrie<DataType>::operator =(const std::vector<DataType>amp;) [with DataType = std::__cxx11::basic_string<char>]’:
TTrieTest.cpp:93:10:   required from here
TTrie.inc:56:19: error: passing ‘const std::vector<std::__cxx11::basic_string<char> >’ as ‘this’ argument discards qualifiers [-fpermissive]
   56 |     sequence.erase(it);
      |     ~~~~~~~~~~~~~~^~~~
In file included from /usr/include/c  /10/vector:67,
                 from TTrie.h:5,
                 from TTrieTest.cpp:1:
/usr/include/c  /10/bits/stl_vector.h:1430:7: note:   in call to ‘std::vector<_Tp, _Alloc>::iterator std::vector<_Tp, _Alloc>::erase(std::vector<_Tp, _Alloc>::const_iterator) [with _Tp = std::__cxx11::basic_string<char>; _Alloc = std::allocator<std::__cxx11::basic_string<char> >; std::vector<_Tp, _Alloc>::iterator = std::vector<std::__cxx11::basic_string<char> >::iterator; std::vector<_Tp, _Alloc>::const_iterator = std::vector<std::__cxx11::basic_string<char> >::const_iterator]’
 1430 |       erase(const_iterator __position)
      |       ^~~~~
In file included from TTrie.h:115,
                 from TTrieTest.cpp:1:

 

Возникают ли проблемы из-за того, что последовательность должна быть постоянной? Я как-то неправильно объявляю итератор? Вот мой код. Пожалуйста, дайте мне знать, если у вас возникнут какие-либо вопросы:

 template<typename DataType>
TTrie<DataType>amp; TTrie<DataType>::operator =(const std::vector<DataType>amp; sequence) {
  const DataType c = sequence[0];
  const TTrie<DataType>* child = getChild(c); //Returns a pointer to a child node or a nullptr

  if (!child) {
    TTrie<DataType>* n = new TTrie<DataType>(c);
    edgeMap[c] = n;
  }

  if(sequence.size() > 1) {
    typename std::vector<DataType>::const_iterator it;
    it = sequence.cbegin(); //First value of sequence
    sequence.erase(it);
    *edgeMap[c]  = sequence;
  }
  return *this;
}
 

Комментарии:

1. sequence Параметр есть const , поэтому вы не можете использовать erase его, так как это изменило бы его.

2. Почему вы operator = vector вообще пытаетесь изменить входные данные? Это вообще очень необычно, но в данном случае это невозможно, так vector как есть const .

Ответ №1:

Ваш sequence параметр является ссылкой на const std::vector<DataType> объект. Но std::vector::erase() не квалифицируется как const метод, так как он изменяет содержимое vector , поэтому его нельзя вызывать для const объекта. Это то, что пытается сообщить вам сообщение об ошибке — это erase() вызывается для const объекта.