没有与参数列表匹配的重载函数问题

        先看问题代码:

#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;
}

错误出现的地方和错误提示如下:

没有与参数列表匹配的重载函数问题

        从上面的代码可以看出使用char c_s[]= "abc"把c_s变量传给map就可以。与此同时,变成const char c_s[]= "abc"它们报的错是一样的。如下:

没有与参数列表匹配的重载函数问题

没有与参数列表匹配的重载函数问题

        从上面的分析来看,直接用"123"传值给map之所以会报错,是因为"123"存放在常量区,是const值;而char c_s[] = "123"存放在栈区吗?