error: passing ‘const xxx’ as ‘this’ argument discards qualifiers c++primer 5th文本查询程序一个错误请各位指教(已解决)
生活随笔
收集整理的這篇文章主要介紹了
error: passing ‘const xxx’ as ‘this’ argument discards qualifiers c++primer 5th文本查询程序一个错误请各位指教(已解决)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文件main.cc
文件main.cc?
#include <string> #include <iostream> #include <memory> #include <vector> #include <set> #include <map> #include <fstream> #include "resultquery.h" #include "textquery.h" using namespace std; int main(int number,char**para) { ifstream in_f(para[1]); runQueries(in_f); return 0; }文件functions.cc
#include <string> #include <iostream> #include <memory> #include <vector> #include <set> #include <map> #include "resultquery.h" #include "textquery.h" #include <sstream> #include <fstream> using namespace std; TextQuery::TextQuery(ifstream &in):file(new vector<string>()){ string line; size_t line_no = 0;while(getline(in,line)){file->push_back(line);string word;istringstream is(line);while(is >> word){if(!str_lines[word])str_lines[word] = make_shared<set<size_t>>();str_lines[word]->insert(line_no);}line_no ++; } } ResultQuery TextQuery::query(const string &s)const{ static shared_ptr<set<size_t>> nodata(new set<size_t>()); if(str_lines.find(s) == str_lines.end()) {return ResultQuery(file,nodata,s); } else {//錯誤點已經找到: //把這個塊內的代碼改成下面的格式就正確了,為啥??? // map<string,shared_ptr<set<size_t>>>::const_iterator pos = str_lines.find(s); // return ResultQuery(file,pos->second,s);return ResultQuery(file,str_lines[s],s); //現在的函數是const的,所以這個成員也變成了const的str_lines為啥? //成員函數是const的,那么會導致調用這個成員函數的所有成員不可改變,就說每個成員都是const的了 //所以就不能用下標運算了,map的下標運算只適合非const的map對象}}ResultQuery::ResultQuery():file(new vector<string>),lines(new set<size_t>){} ResultQuery::ResultQuery(shared_ptr<vector<string>> f,shared_ptr<set<size_t>> l,const string &w):file(f),lines(l),word(w){}set<size_t>::iterator ResultQuery::begin(){return lines->begin(); } set<size_t>::iterator ResultQuery::end(){return lines->end(); } shared_ptr<vector<string>> ResultQuery::get_file(){return file;}void runQueries(ifstream &in){ TextQuery t(in); string word; cout << "enter a word you want to find(q to end):" << endl; cin >> word; print(cout,t.query(word)); }ostream& print(ostream &os,const ResultQuery &qr) { os << qr.word << " occurs " << qr.lines->size() << " times:" << endl; for(auto &i : *qr.lines){cout << "(line " << i+1 << " )" << (*qr.file)[i] << endl;} return os; }文件testquery.h
#ifndef TEXTQUERY_H #define TEXTQUERY_H#include <string> #include <iostream> #include <memory> #include <vector> #include <set> #include <map> #include "resultquery.h" using namespace std; class ResultQuery; class TextQuery{public:TextQuery():file(make_shared<vector<string>>()){}TextQuery(ifstream &);ResultQuery query(const string &)const;private:shared_ptr<vector<string>> file;map<string,shared_ptr<set<size_t>>> str_lines;};void runQueries(ifstream &);#endif文件resultquery.h?
#ifndef RESULTQUERY_H #define RESULTQUERY_H #include <string> #include <iostream> #include <memory> #include <vector> #include <set> #include <map> using namespace std; class ResultQuery{friend ostream& print(ostream &,const ResultQuery &qr);public:ResultQuery();ResultQuery(shared_ptr<vector<string>> f,shared_ptr<set<size_t>> l,const string &w);shared_ptr<vector<string>> get_file();set<size_t>::iteratorbegin();set<size_t>::iteratorend();private:shared_ptr<vector<string>> file;shared_ptr<set<size_t>> lines;string word;}; ostream & print(ostream &,const ResultQuery &qr);#endif?在ubuntu20.04中執行編譯:
g++ main.cc functions.cc -o 123結果如下:
functions.cc: In member function ‘ResultQuery TextQuery::query(const string&) const’: functions.cc:38:43: error: passing ‘const std::map<std::__cxx11::basic_string<char>, std::shared_ptr<std::set<long unsigned int> > >’ as ‘this’ argument discards qualifiers [-fpermissive]38 | return ResultQuery(file,str_lines[s],s);| ^ In file included from /usr/include/c++/9/map:61,from functions.cc:6: /usr/include/c++/9/bits/stl_map.h:490:7: note: in call to ‘std::map<_Key, _Tp, _Compare, _Alloc>::mapped_type& std::map<_Key, _Tp, _Compare, _Alloc>::operator[](const key_type&) [with _Key = std::__cxx11::basic_string<char>; _Tp = std::shared_ptr<std::set<long unsigned int> >; _Compare = std::less<std::__cxx11::basic_string<char> >; _Alloc = std::allocator<std::pair<const std::__cxx11::basic_string<char>, std::shared_ptr<std::set<long unsigned int> > > >; std::map<_Key, _Tp, _Compare, _Alloc>::mapped_type = std::shared_ptr<std::set<long unsigned int> >; std::map<_Key, _Tp, _Compare, _Alloc>::key_type = std::__cxx11::basic_string<char>]’490 | operator[](const key_type& __k)為啥錯誤?
代碼中的分析得到如下結論:
const成員函數的所有成員不可改變,就是說const成員函數把調用它的對象所有成員都const化了(即使原來不是const的成員,現在都不可改變就變成const的了)。如下:
//test.cc
class T{public:int *ptr()const{return &a;}private:int a;int b;};編譯后錯誤如下:
test.cc: In member function ‘int* T::ptr() const’: test.cc:11:26: error: invalid conversion from ‘const int*’ to ‘int*’ [-fpermissive]11 | int *ptr()const{return &a;}| ^~| || const int*也就是說現在成員函數中的a就是const的了,即使原來的類中不是const的。所以返回值&a就是const int*類型?,當然不能轉化成int *。
? ? ? ? 到此,開始代碼中文件functions.cc中的錯誤就非常好理解了,const成員函數query中所有的數據成員都const化了,所以str_lines也是const的了,所以它的元素的指針當然是const的(find成員函數的到的指針也是const的),所以導致錯誤。所以const map對象不能用下標操作,但是可以用指針操作來訪問值。
?
總結
以上是生活随笔為你收集整理的error: passing ‘const xxx’ as ‘this’ argument discards qualifiers c++primer 5th文本查询程序一个错误请各位指教(已解决)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: QT之error: cannot bin
- 下一篇: c++ primer文本查询程序 自编加