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

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

时间:2024-01-02 12:05:59浏览次数:39  
标签:set const 函数 int IntCompare 报错 volatile se



文章目录

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








一、报错信息



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

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

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



定义如下仿函数 IntCompare

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

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

完整代码如下 :

#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:\001_Develop\017_Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30133\include\xutility 1516






二、问题分析



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

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

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

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

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



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

使用 const volatile 修饰这个函数 ;

修改后的仿函数如下 :

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) 函数 ;

修改后的代码为 :

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

完整代码为 :

#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 . . .

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


标签:set,const,函数,int,IntCompare,报错,volatile,se
From: https://blog.51cto.com/u_14202100/9066902

相关文章

  • MySQL yum安装常见报错
    yum安装MySQL报公钥尚未安装解决方案1:将yum文件里的mysql-community.repo,编辑,gpgcheck=0解决方案二:更新RPM-GPG-KEY-mysql文件......
  • 如何安装 macOS Big Sur 11.0 Beta 虚机,解决 “BiErrorDomain Error 3.” 报错
    作者:https://sysin.org1.获取官方的macOSBeta软件包官网直接下载,双击直接安装:点击下载Betaprofile,通过软件更新下载上述两种方式,都会将InstallmacOSBeta.app放置于/Applications(应用程序)下面。2.安装方式1.升级安装,下载后直接点击“InstallmacOSBeta”2.在当前系统......
  • Dart final const
    Dart中的const和final在Dart编程语言中,const和final关键字都用于声明常量。虽然它们的目的相同,但在语义和使用上略有不同。constconst关键字用于创建不可变(immutable)的常量,这些常量的值必须在编译时就已知。const可以用于变量、方法和集合(如List)的声明。对于变量,const表示该......
  • ant design pro移除国际化报错解决步骤
    一、环境ant-design-pro版本:6.0.0npm版本:8.1.0node版本:v16.13.0二、开步骤1、点击移除按钮2、报错误"Failedtoloadconfig"prettier"toextendfrom."3、使用命令"npmi--save-devprettiereslint-config-prettiereslint-plugin-prettier"(参考github官方is......
  • appium报错DeprecationWarning: desired_capabilities argument is deprecated and wi
    不再用desired_capabilities,用options代替原来的desired_caps={"platformName":"ios","platformVersion":"11.4","deviceName":"iPhone6Plus",&......
  • 一个报错深刻理解axios传参和mock拦截(外加正则表达式)
    前言:事情是这样的,在使用axios二次封装和mock进行拦截的时候,不是参数传递方式不正确就是找不到后端接口,为此我茶不思饭不想把axios和mock好好看了一遍,最后除了这些问题,发现是输在了正则表达式上面,找出错误的时候自己都懵了axioa传参问题总所周知,我们在平时使用axios的时候是这样......
  • Var 和 Let 以及 Const
    var是最开始的JavaScript关键词之一,一个变量在JavaScript中,分为声明和初始化。var具有变量提升无论声明在哪里,变量提升会把都会提升到该作用域的最顶部,你在任何地方都会访问的到函数作用域,而且可以多次声明,就会造成你自己啥时候覆盖了都不知道Let和Const具有块级作用域当......
  • centos中使用yum报错
    1、执行yumrepolist具体报错内容Loadedplugins:product-id,search-disabled-repos,subscription-managerThissystemisnotregisteredwithanentitlementserver.Youcanusesubacription-managertoregister. File"/usr/libexec/urlgrabber-ext-down",line2......
  • 用python打开文件获取文件属性时,运行报错PermissionError: [Errno 13] Permission den
    一:概述在开发中我们经常会使用python程序去对物理主机平台上的文件进行操作,在这里说明一下,python中获取文件属性时,运行出现的错误。二:具体说明<1>获取文件属性的代码importos#创建一个临时目录temp_dir='temp'os.mkdir(temp_dir)#在临时目录中创建一个文件temp_file=o......
  • 下载文件报错:java.io.IOException: UT010029: Stream is closed
    在项目中使用EasyExcel导出excel然后压缩成压缩包下载,下载也是能正常下载就是会抛出这个错误虽然说这个错误不影响下载功能,搞不好就因为这个错误某天系统崩溃,那时候就不是这么好玩了,于是我在百度上疯狂查找有的说是流没有关,要在finally里面把流关了关了之后,满怀期待的重新运......