在set集合中使用二元謂詞(編譯器錯誤 C3848)

案例:在set集合中插入小寫字母,通過find去查找,而find函數區分大小寫。因此需要通過仿函數來解決

struct NoDistincyion
{
	bool operator()(const string &str1,const string &str2)
	{
		string str1_;
		str1_.resize(str1.size());
		transform(str1.begin(), str1.end(), str1_.begin(), tolower);//預定義函數對象

		string str2_;
		str2_.resize(str2.size());
		transform(str2.begin(), str2.end(), str2_.begin(), tolower);//預定義函數對象

		return str1_ < str2_;//從小到大排序
	}
};


void Fun1()
{
	set<string> s1;
	s1.insert("aa");
	s1.insert("bb");
	s1.insert("cc");

	set<string>::iterator it = s1.find("aa");//find 會區分大小寫
	if (it == s1.end())
	{
		cout << "沒有找到" << endl;
	}
	else
	{
		cout << "找到了" << endl;
	}

	set<string, NoDistincyion> s2;
	s2.insert("aa");
	s2.insert("bb");
	s2.insert("cc");

	set<string,NoDistincyion>::iterator it1 = s2.find("aA");//find 會區分大小寫
	if (it1 == s2.end())
	{
		cout << "沒有找到" << endl;
	}
	else
	{
		cout << "找到了" << endl;
	}
}

在vs2017編譯器下報錯:編譯器錯誤 C3848

具有類型“const NoDistincyion”的表達式會丟失一些 const - volatile 限定符以調用“bool NoDistincyion::operator ()(const std::string &, const std::string &)“

意思是在使用NoDistincyion時存在const屬性,但是調用該NoDistincyion的表達式bool operator()(const string &str1,const string &str2)不具有const屬性,丟失const,所以無法通過編譯

修改之後

bool operator()(const string &str1,const string &str2) const
{
    string str1_;
    str1_.resize(str1.size());
    transform(str1.begin(), str1.end(), str1_.begin(), tolower);//預定義函數對象


    string str2_;
    str2_.resize(str2.size());
    transform(str2.begin(), str2.end(), str2_.begin(), tolower);//預定義函數對象

    return str1_ < str2_;//從小到大排序
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章