【错误记录】set 集合容器仿函数报错 ( 具有类型“const IntCompare”的表达式会丢失一些 const-volatile 限定符以调用“bool IntCompare::oper“ )

2023-12-29 09:57:02 浏览数 (2)

文章目录
  • 一、报错信息
  • 二、问题分析
  • 三、解决方案

一、报错信息


使用 仿函数 为 set 集合容器 定义 元素排序规则 ;

仿函数 functor 是一个在许多编程语言中都存在的概念 , 它通常指一个对象 , 该对象能像函数那样被调用 ; 具体来说 , 仿函数是一个类 , 该类重载了operator() 函数 , 使其可以像函数那样被调用 , 这种类通常被称为仿函数类或函数对象 ;

在 C 语言中 , 仿函数可以用来实现高阶函数 , 即接受函数作为参数或返回函数的函数 ; 例如 : C 标准库中的 std::less / std::plus 等都是仿函数类 ;

定义如下仿函数 IntCompare

代码语言:javascript复制
struct IntCompare {
	bool operator()(const int& a, const int& b) {
		return (a < b);	// 降序排序  
	}
};

如果调用 set 集合的 insert 函数 , 就会报错 ;

完整代码如下 :

代码语言:javascript复制
#define  _CRT_SECURE_NO_WARNINGS
#include "iostream"
using namespace std;
#include "set"

struct IntCompare {
	bool operator()(const int& a, const int& b) {
		return (a < b);	// 降序排序  
	}
};

int main() {

	// set 集合容器
	// 初始化列表中的顺序会自动排序
	set<int, IntCompare> se;

	// 插入数据
	se.insert(9);
	se.insert(5);
	se.insert(2);
	se.insert(7);

	// 遍历 set 集合容器
	for (set<int, IntCompare>::iterator it = se.begin(); it != se.end(); it  )
	{
		cout << *it << " ";
	}
	// 回车换行
	cout << endl;

	// 控制台暂停 , 按任意键继续向后执行
	system("pause");

	return 0;
};

上述程序报错信息如下 :

严重性 代码 说明 项目 文件 行 禁止显示状态 错误 C3848 具有类型“const IntCompare”的表达式会丢失一些 const-volatile 限定符以调用“bool IntCompare::operator ()(const int &,const int &)” HelloWorld D:01_Develop17_Microsoft Visual Studio2019CommunityVCToolsMSVC14.29.30133includexutility 1516

二、问题分析


const 和 volatile 是 C 中的两个关键字 , 它们通常用于修饰变量或函数 ;

这两个限定符的作用和用途不同 , 但在某些情况下可以一起使用 ;

const 关键字用于表明某个变量的值不能被修改 ; 它可以修饰变量、指针、数组等 ;

volatile 关键字告诉编译器这个变量可能会在任何时刻被外部因素(如操作系统或其他进程)改变 ; 因此,编译器不会对该变量进行优化 ;

当 const 和 volatile 一起使用时 , const-volatile 限定符 , 它们表示这个变量是常量并且可能会被外部因素改变 ;

报错信息中说明 , 调用 bool IntCompare::operator ()(const int &,const int &) 函数时 , 可能会丢失 const-volatile 限定符 ;

使用 const volatile 修饰这个函数 ;

修改后的仿函数如下 :

代码语言:javascript复制
struct IntCompare {
	bool operator()(const int& a, const int& b) const volatile {
		return (a < b);	// 降序排序  
	}
};

三、解决方案


使用 const volatile 修饰 bool operator()(const int& a, const int& b) 函数 ;

修改后的代码为 :

代码语言:javascript复制
struct IntCompare {
	bool operator()(const int& a, const int& b) const volatile {
		return (a < b);	// 降序排序  
	}
};

完整代码为 :

代码语言:javascript复制
#define  _CRT_SECURE_NO_WARNINGS
#include "iostream"
using namespace std;
#include "set"

struct IntCompare {
	bool operator()(const int& a, const int& b) const volatile {
		return (a < b);	// 降序排序  
	}
};

int main() {

	// set 集合容器
	// 初始化列表中的顺序会自动排序
	set<int, IntCompare> se;

	// 插入数据
	se.insert(9);
	se.insert(5);
	se.insert(2);
	se.insert(7);

	// 遍历 set 集合容器
	for (set<int, IntCompare>::iterator it = se.begin(); it != se.end(); it  )
	{
		cout << *it << " ";
	}
	// 回车换行
	cout << endl;

	// 控制台暂停 , 按任意键继续向后执行
	system("pause");

	return 0;
};

执行结果 :

2 5 7 9 Press any key to continue . . .

0 人点赞