关于一个inline用法的问题,请进来看看
- C/C++ code
#include <iostream>#include <sstream>#include <fstream>#include <string>#include <vector>#include <map>#include <set>using std::cin;using std::cout;using std::endl;using std::string;using std::vector;using std::ostream;using std::fstream;using std::stringstream;using std::set;using std::multimap;using std::pair;using std::runtime_error;class TextQuery{public: typedef multimap<string,int>::const_iterator multi_con_iter; typedef pair<TextQuery::multi_con_iter,TextQuery::multi_con_iter> multi_word_range; bool Is_file_ok; void Text_file_set(const string& file_path); pair<multi_con_iter,multi_con_iter> RUN_QW(string Query_word); void QueryPrint();private: pair<multi_con_iter,multi_con_iter> Query_word_range; multimap<string,int> Word_line; set<int> Get_text_line; vector<string> Text_file; int Occurs_time;};void TextQuery::Text_file_set(const string& file_path){ fstream open_text_file; open_text_file.open(file_path.c_str(),fstream::in); if(!open_text_file) {Is_file_ok=false;} else{ string tempsentence; Text_file.clear(); while(getline(open_text_file,tempsentence)) Text_file.push_back(tempsentence); open_text_file.close(); open_text_file.clear(); int line=1; Word_line.clear(); stringstream get_each_word_line; for(vector<string>::const_iterator iter=Text_file.begin();iter!=Text_file.end();iter++,line++){ get_each_word_line.str(*iter); while(get_each_word_line>>tempsentence){ Word_line.insert(make_pair(tempsentence,line)); }get_each_word_line.clear(); } Is_file_ok=true; }}TextQuery::multi_word_range TextQuery::RUN_QW(string Query_word){ if(!Is_file_ok) throw runtime_error("Could NOT OPEN THE FILE!"); Get_text_line.clear(); Occurs_time=0; Query_word_range=Word_line.equal_range(Query_word); while(Query_word_range.first!=Query_word_range.second){ Get_text_line.insert(Query_word_range.first->second); Occurs_time++; Query_word_range.first++; } return Query_word_range;}void TextQuery::QueryPrint(){ if(!Is_file_ok){ cout <<"ERROR!! Could Not Open File!"<<endl; return; } if(!Occurs_time) cout <<"No search word"<<endl; else{ cout <<"element occurs "<<Occurs_time<<" time :"<<endl; for(set<int>::const_iterator iter=Get_text_line.begin();iter!=Get_text_line.end();iter++){ cout <<*iter<<" "<<Text_file[*iter-1]<<endl; } } }//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////class Query_base{friend class Query; public: virtual ~Query_base(){} private: virtual TextQuery::multi_word_range eval(const TextQuery&)const=0; virtual ostream& display(ostream& =cout)const=0;};class Query{friend Query operator~(const Query&);friend Query operator&(const Query&,const Query&);friend Query operator|(const Query&,const Query&);public: TextQuery::multi_word_range eval(const TextQuery &t)const{return pq->eval(t);} ostream& display(ostream& os)const{return pq->display(os);}//constructor Query(const string &); Query(const Query &origin):pq(origin.pq),use(origin.use){*use++;} //destructor ~Query(){decr_use();}//operatorQuery& operator=(const Query&); private: void decr_use(){if (--*use==0)delete pq;delete use;} Query(Query_base *q):pq(q),use(new size_t(1)){}; Query_base *pq; size_t *use; };ostream& operator<<(ostream& os,const Query& Q){return Q.display(os);}class WordQuery:public Query_base{friend class Query; TextQuery::multi_word_range eval(TextQuery& t)const{return t.RUN_QW(QW);} ostream& display(ostream& os)const{return os<<QW;}//constructor WordQuery(const string& s):QW(s){} private: string QW;};class NotQuery:public Query_base{friend Query operator~(const Query&);public: TextQuery::multi_word_range eval(const TextQuery& t)const; ostream& display(ostream& os)const{return os<<"~"<<"\""<<NQ<<"\"";}//constructor NotQuery(Query q):NQ(q){}private: const Query NQ; };class BinaryQuery:public Query_base{ friend class Query;public: ostream& display(ostream& os)const/*{return os<<" "<<LQ<<" "<<oper<<RQ;}*/;//constructor BinaryQuery(Query L,Query R,string op):LQ(L),RQ(R),oper(op){} private: const Query LQ,RQ; const string oper; };class AndQuery:public BinaryQuery{friend Query operator&(const Query& q1,const Query& q2);public: TextQuery::multi_word_range eval(const TextQuery&)const;//constructor AndQuery(Query L,Query R):BinaryQuery(L,R,"&"){} };class OrQuery:public BinaryQuery{friend Query operator|(const Query& q1,const Query& q2);public: TextQuery::multi_word_range eval(const TextQuery&)const;//constructor OrQuery(Query L,Query R):BinaryQuery(L,R,"|"){} };inline Query operator~(const Query& q){return new NotQuery(q);}inline Query operator&(const Query& q1,const Query& q2){return new AndQuery(q1,q2);}inline Query operator|(const Query& q1,const Query& q2){return new OrQuery(q1,q2);}
代码出处(本人略修改): 《C++ Primer 4th(中文版)》 第15章 P515
所有源码已经贴出,请留意一下最后三行的inline,我在编译的时候如果去掉编inline译器就会提示:
error LNK2001: 无法解析的外部符号 "public: virtual struct std::pair<class std::_Tree_const_iterator<class std::_Tree_val<class std::_Tmap_traits<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,int,struct std::less<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >,class std::allocator<struct std::pair<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const ,int> >,1> > >,class std::_Tree_const_iterator<class std::_Tree_val<class std::_Tmap_traits<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,int,struct std::less<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >,class std::allocator<struct std::pair<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const ,int> >,1> > > > __thiscall NotQuery::eval(class TextQuery const &)const " (?eval@NotQuery@@UBE?AU?$pair@V?$_Tree_const_iterator@V?$_Tree_val@V?$_Tmap_traits@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@HU?$less@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@H@std@@@2@$00@std@@@std@@@std@@V12@@std@@ABVTextQuery@@@Z)
primer.exe : fatal error LNK1120: 1 个无法解析的外部命令
如果加入inline就没有任何报错,这个是什么原因呢?inline难道不只是建议编译器用内联的方式展开代码吗?为什么去掉之后却会报错?请各位帮忙看看,百思不得其解中。。。谢谢!
[解决办法]
最后三行有问题吧,没有域作用符呀。。。