首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

关于一个inline用法的有关问题,请进来看看

2012-11-16 
关于一个inline用法的问题,请进来看看C/C++ code#include iostream#include sstream#include fstream

关于一个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难道不只是建议编译器用内联的方式展开代码吗?为什么去掉之后却会报错?请各位帮忙看看,百思不得其解中。。。谢谢!

[解决办法]
最后三行有问题吧,没有域作用符呀。。。

热点排行