文件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文本查询程序一个错误请各位指教(已解决)相关推荐

  1. C++ STL编译报错:error: error passing 'const' as 'this' argument

    用C++ STL(标准模板库)编写仿函数的时候,编译报错: error: passing 'const FindNameOrAddress' as 'this' argument of 'bool F ...

  2. C++编程常见问题—error: passing 'const std::map]' discards qualifiers或pass-by-reference-to-const-map导致的“d

    产生问题的场景: int func(const map<int, string> &aMap) { string value = amap[0]; } 或者 int  Test:: ...

  3. 【c++常见错误01】error C2662: ‘const xxx‘: cannot convert ‘this‘ pointer from ‘xxx‘ to ‘xxx‘

    原因 造成这个错误的一般原因是常量对象尝试调用该对象里的非常量函数,例如class Bala里有一个普通的成员函数func(),在某处声明了Bala类常量对象bala,const Bala bala, ...

  4. CSP error: LinAlgError : The leading minor of order XX of B is not positive definite.报错调试过程(算已解决?)

    1.报错内容: 问题描述:用CSP和FBCSP对运动想象任务进行分类,调用mne库的函数.数据是自采的四分类数据,已经过滤波.降采样等预处理,在分类前已将trial打乱顺序,并进行标准化处理.数据是从 ...

  5. 解决 error: called object ‘xxx‘ is not a function or function pointer

    代码编译时遇到报错: error: called object 'xxx' is not a function or function pointer| 导致原因:数学表达式错误 或 使用了某些数学函 ...

  6. C++ ERROR:error: passing 'XXX' as 'this' argument of 'XXX' discards qualifiers

    遇到了如题目的这种错误: error: passing 'XXX' as 'this' argument of 'XXX' discards qualifiers 如何产生的? 我将一个const变量 ...

  7. 1. 无法解析的外部符号 “__declspec(dllimport) const XXX::vftable“ ` 2. `无法定义 dllimport 实体`

    由于自己C++基础薄弱,导致这一系列的Bug改了好久好久....记录一部分,我还记得的 编译通过镇一下哈哈 Bug1 error LNK2001: 无法解析的外部符号 "__declspec ...

  8. Eclipse error: “The import XXX cannot be resolved”

    解决 Eclipse error: "The import XXX cannot be resolved" eclipse中修改: 1. 项目-->Properties--& ...

  9. IDEA中进行SpringBoot开发时提示:Error resolving template xxx, template might not exist or might not be acce

    场景 IDEA中进行SpringBoot开发时提示: Error resolving template "xxx", template might not exist or mig ...

最新文章

  1. win32 masm32 汇编学习 及 远程线程实例
  2. 基于c#的相关性分析_开源Math.NET基础数学类库使用(11)C#计算相关系数
  3. 信息系统项目管理师优秀论文:项目整体管理
  4. Hadoop之HDFS常用Shell命令
  5. python提示对话框自动关闭_Python - tkinter:打开和关闭对话框窗口
  6. 【aRsenal-1】用R创建Word和PowerPoint文档
  7. 突发奇想-怎么写一个死锁?
  8. php两个手机号正则表达式_php中手机号码正则表达式代码
  9. ubuntu安装rubyOnRails
  10. 在中兴新支点操作系统玩换装游戏
  11. SpringBoot--定义全局日期响应格式
  12. MC34063在扩展后的降压应用
  13. matlab三重积分计算方法,一般区域二重、三重积分MATLAB计算方法
  14. unity 2d 动画
  15. Transformers in Vision: A Survey论文翻译
  16. 台式计算机的选购标准,如何选购台式电脑机箱?小白装机选购电脑机箱知识指南(2)...
  17. 【开发日志-已归档】2021-11
  18. 本地计算机上的OracleOraDb11g_home1TNSListener服务启动后停止,某些服务在未由其他服务或程序使用时将自动停止
  19. BCGControlBar使用工具教程
  20. PMP备考之路 - 汪博士第十一章(项目风险管理)

热门文章

  1. 七天来学习ASP.NET MVC (两)——ASP.NET MVC 数据传输
  2. word2007中如何隐藏工具栏
  3. ndroid网络(4):HttpClient必经之路----使用线程安全的单例模式HttpClient,及HttpClient和Application的融合...
  4. 100%测试覆盖率真的有用吗?
  5. Hadoop学习总结:Map-Reduce的过程解析
  6. 编写你的第一个 Django 应用,第 3 部分
  7. 阿里云centos7安装和卸载图形化操作界面
  8. 使用C++实现多张BMP图片转换为YUV动画----附加淡入淡出转场(逐渐变明变暗),及垂直滑像转场(逐行渐变)
  9. 【Linux】一步一步学Linux——lsattr命令(116)
  10. java 的tree_Java TreeSet higher()方法