1. 程式人生 > >沒有與引數列表匹配的過載函式問題

沒有與引數列表匹配的過載函式問題

        使用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(...)出現,其他的程式碼沒有問題):

在函式void f(...)中出錯的提示

        從上面的main函式程式碼中可以看到使用char c_s[]= "abc"把c_s變數傳給map就可以。與此同時,變成const char c_s[]= "abc"它們報的錯是一樣的。如下:

在函式void f(...)中出錯的提示
變成const後錯誤提示

        分析:從上面的分析來看,直接用"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)卻沒有問題,這是又是為什麼呢?