编译文本查询程序出错,请帮忙查下到底哪错了!

shan794462554 2015-07-29 10:41:20
正在学c++,编译书上的文本查询程序出错,因水平有限,请帮忙查下到底哪错了!
build log:
g++ -std=c++11 -c /home/mylw/cpp/answers/4-30.cpp -o /home/mylw/cpp/answers/4-30.o
g++ -o /home/mylw/cpp/answers/4-30 /home/mylw/cpp/answers/4-30.o
/home/mylw/cpp/answers/4-30.o:在函数‘runQueries(std::basic_fstream<char, std::char_traits<char> >&)’中:
4-30.cpp:(.text+0xa2):对‘TextQuery::TextQuery(std::basic_fstream<char, std::char_traits<char> >&)’未定义的引用
4-30.cpp:(.text+0x139):对‘TextQuery::query(std::string const&) const’未定义的引用
4-30.cpp:(.text+0x14d):对‘print(std::ostream&, QueryResult const&)’未定义的引用
collect2: error: ld returned 1 exit status
Process terminated with status 1 (0 minute(s), 0 second(s))
0 error(s), 0 warning(s) (0 minute(s), 0 second(s))


//TextQuery.h

#ifndef TEXTQUERY_H_INCLUDED
#define TEXTQUERY_H_INCLUDED

#include <vector>
#include <map>
#include <set>
#include <string>
#include <fstream>
#include <memory>
class QueryResult;
class TextQuery
{
public:
using line_no=std::vector<std::string>::size_type;
TextQuery(std::fstream&);
QueryResult query(const std::string&) const;
private:
std::shared_ptr<std::vector<std::string>> file;
std::map<std::string,std::shared_ptr<std::set<line_no>>> wm;
};
class QueryResult
{
friend std::ostream &print(std::ostream&,const QueryResult&);
public:
QueryResult(std::string s,std::shared_ptr<std::set<TextQuery::line_no>> p,std::shared_ptr<std::vector<std::string>> f):sought(s),lines(p),file(f){}
private:
std::string sought;
std::shared_ptr<std::set<TextQuery::line_no>> lines;
std::shared_ptr<std::vector<std::string>> file;
};

#endif // TEXTQUERY_H_INCLUDED



//TextQuery.cpp

#include "TextQuery.h"
#include <sstream>
#include <algorithm>
#include <ostream>
using std::string;
using std::vector;
using std::set;
using std::istream;
using std::istringstream;
using std::shared_ptr;
using std::fstream;
using std::ostream;
using std::endl;
TextQuery::TextQuery(fstream &is):file(new vector<string>)
{
string text;
while(getline(is,text))
{
file->push_back(text);
int n=file->size()-1;
istringstream line(text);
string word;
while(line>>word)
{
auto &lines=wm[word];
if(!lines)
lines.reset(new set<line_no>);
lines->insert(n);
}
}
}
string make_plural(size_t ctr,const string &word,const string &ending)
{
return (ctr>1)?word+ending:word;
}
QueryResult TextQuery::query(const string &sought) const
{
static shared_ptr<set<line_no>> nodata(new set<line_no>);
auto loc=wm.find(sought);
if(loc==wm.end())
return QueryResult(sought,nodata,file);
else
return QueryResult(sought,loc->second,file);
}
ostream &print(ostream &os,const QueryResult &qr)
{
os<<qr.sought<<"occurs"<<qr.lines->size()<<" "<<make_plural(qr.lines->size(),"time","s")<<endl;
for(auto num:*qr.lines)
os<<"\t(line"<<num+1<<")"<<*(qr.file->begin()+num)<<endl;
return os;
}





//main()

#include "TextQuery.h"
#include <iostream>
using std::fstream;
using std::string;
using std::cout;using std::endl;using std::cin;
void runQueries(fstream &infile)
{
TextQuery tq(infile);
while(true)
{
cout<<"enter word to look for,or q to quit:";
string s;
if(!(cin>>s)||s=="q")
break;
print(cout,tq.query(s))<<endl;
}
}
int main()
{
fstream file("~/. 1111");
runQueries(file);
return 0;
}

...全文
241 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

64,649

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧