沒有與引數列表匹配的過載函式問題
阿新 • • 發佈:2018-12-25
使用map<char*,int,ptr_cmp>沒有與引數列表匹配的過載函式問題。
1.先看在void f(...)中有問題程式碼:
#include<iostream> #include<map> #include<iterator> #include<Windows.h> #include<string> using namespace std; struct ptrCmp{ bool operator()( const char * s1, const char * s2 ) const { return strcmp( s1, s2 ) < 0; } }; struct Cstring_less{ bool operator()(const char* p,const char* q) const { return strcmp(p,q)<0; } }; void f(map<char*,int,Cstring_less>&m,multimap<char*,int,Cstring_less>&mm) { m.insert(make_pair("x",4)); m.insert(make_pair("x",5)); mm.insert(make_pair("x",4)); mm.insert(make_pair("x",5)); } int main() { map<char*,int,Cstring_less>m; multimap<char*,int,Cstring_less>mm; f(m,mm); map<char *, int, Cstring_less> mapStr; char c_s[]= "abc"; char c_s1[] = "ab"; mapStr.insert(make_pair(c_s,1)); mapStr.insert(make_pair(c_s,3)); mapStr.insert(make_pair(c_s1,3)); map<char *, int, Cstring_less>::const_iterator c_t; for(c_t = mapStr.begin();c_t != mapStr.end();c_t++) cout<<c_t->first<<" "<<c_t->second<<endl; system("PAUSE"); return 0; }
錯誤出現的地方和錯誤提示如下(錯誤只在void f(...)出現,其他的程式碼沒有問題):
從上面的main函式程式碼中可以看到使用char c_s[]= "abc"把c_s變數傳給map就可以。與此同時,變成const char c_s[]= "abc"它們報的錯是一樣的。如下:
分析:從上面的分析來看,直接用"123"傳值給map之所以會報錯,是因為"123"存放在常量區,是const值;而char c_s[] = "123"存放在棧區嗎?我現在還不是十分確定。
2.修改後的執行的程式碼如下:
#include<iostream> #include<map> #include<iterator> #include<Windows.h> #include<string> using namespace std; struct ptrCmp{ bool operator()( const char * s1, const char * s2 ) const { return strcmp(s1,s2) < 0; } }; struct Cstring_less{ bool operator()(const char* p,const char* q) const { return strcmp(p,q)<0; } }; void f(map<char*,int,Cstring_less>&m,multimap<char*,int,Cstring_less>&mm) { char c[] = "y1"; char* p = "xb"; char ab[] = "1234"; m.insert(make_pair(c,4)); m.insert(make_pair(c,5)); m.insert(make_pair(ab,5)); mm.insert(make_pair(p,4)); mm.insert(make_pair(p,5)); } int main() { map<char*,int,Cstring_less>m; multimap<char*,int,Cstring_less>mm; f(m,mm); map<char *, int, ptrCmp> mapStr; char c_s[]= "abc"; char c_s1[] = "ab"; m.insert(make_pair(c_s,12)); mapStr.insert(make_pair(c_s,1)); mapStr.insert(make_pair(c_s,3)); mapStr.insert(make_pair(c_s1,3)); cout<<"mapStr:"<<endl; map<char *, int, ptrCmp>::const_iterator c_t1; for(c_t1 = mapStr.begin();c_t1 != mapStr.end();c_t1++) cout<<c_t1->first<<" "<<c_t1->second<<endl; cout<<"m:"<<endl; map<char *, int, Cstring_less>::const_iterator c_t2; for(c_t2 = m.begin();c_t2 != m.end();c_t2++) cout<<c_t2->first<<" "<<c_t2->second<<endl; cout<<"mm:"<<endl; map<char *, int, Cstring_less>::const_iterator c_t3; for(c_t3 = mm.begin();c_t3 != mm.end();c_t3++) cout<<c_t3->first<<" "<<c_t3->second<<endl; system("PAUSE"); return 0; }
執行結果如下:
但是結果卻又有問題,如上,在void f(...)中新增的make_pair()出現亂碼了,但是在main中新增的make_pair(c_s,12)卻沒有問題,這是又是為什麼呢?