簡體   English   中英

在模板中使用 vector::erase 時將 const 迭代器作為 'this' 參數傳遞會丟棄限定符

[英]passing const iterator as ‘this’ argument discards qualifiers while using vector::erase in a template

我正在嘗試刪除模板類型名向量的第一個值。 在向量 stl 中使用 erase() 方法,我不斷收到此錯誤:

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>& TTrie<DataType>::operator+=(const std::vector<DataType>&) [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>& TTrie<DataType>::operator+=(const std::vector<DataType>& 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;
}

您的sequence參數是對const std::vector<DataType> object 的引用。 但是std::vector::erase()不被限定為const方法,因為它修改了vector的內容,因此不能在const object 上調用它。 這就是錯誤消息試圖告訴您的內容 - 在const object 上調用了erase()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM