ERROR C3848:具有类型"const XXX" 的表达式会丢失一些 const-volatile 限定符以调用"YYY" with"ZZZ"
今天看书,Thinking in c++ volume 2 "Adaptable function objects"
里面作者说:
Suppose, for example, that we want to make the function object gt_n, defined
earlier in this chapter, adaptable. All we need to do is the following:class gt_n : public unary_function<int, bool> {
int value;
public:
gt_n(int val) : value(val) {}
bool operator()(int n) {
return n > value;
}
};
然后我做了一个template
#ifndef GREATERTHANN_HPP
#define GREATERTHANN_HPP #include <functional> namespace ZJ {
template <class ArgType, class Result = bool>
struct gt_n : public std::unary_function<ArgType, Result>
{
private:
ArgType value;
public:
gt_n(const ArgType& val) : value(val) {}
Result operator()(ArgType n) { return (n > value); }
ArgType getVal() { return value; }
};
} #endif // GREATERTHANN_HPP
测试代码:
//: C06:GreaterThanN.cpp #include "GreaterThanN.hpp" #include <iostream>
#include <functional>
#include <algorithm> using namespace ZJ;
using namespace std; int main() {
int a[] = { , , , , -, -, };
const size_t SIZE = sizeof a / sizeof a[]; gt_n<int> predicate();
cout << "gt_n.getVal() = " << predicate.getVal() << endl; cout << count_if(a, a + SIZE, not1(predicate)) << endl; //
return ;
} ///:~
编译时报错
: error C3848: 具有类型“const ZJ::gt_n<int,bool>”的表达式会丢失一些 const-vola
tile 限定符以调用“bool ZJ::gt_n<int,bool>::operator ()(ArgType)”
with
[
ArgType=int
]
看起来大概意思是:你用的gt_n<int, bool>的instance具有const属性,但是调用该instance的表达式(也就是“bool ZJ::gt_n<int,bool>::operator ()(ArgType))不具有const属性,丢失const,所以无法通过编译
最开始我在看main里面,predicate不具有const属性啊
后来去查std::not1的文档:http://en.cppreference.com/w/cpp/utility/functional/not1
template< class Predicate >
std::unary_negate<Predicate> not1(const Predicate& pred);
因为std::not1用的是const Predicate&,所以我的predicate到not1之中以后就是const Predicate&了,所以在调用operator()的时候要求operator()也具有const属性,否则就会导致丢失const限定符的错误
因此解决办法就是给operator()加上const属性,如下:
#ifndef GREATERTHANN_HPP
#define GREATERTHANN_HPP #include <functional> namespace ZJ {
template <class ArgType, class Result = bool>
struct gt_n : public std::unary_function<ArgType, Result>
{
private:
ArgType value;
public:
gt_n(const ArgType& val) : value(val) {}
Result operator()(ArgType n) const { return (n > value); }
ArgType getVal() { return value; }
};
} #endif // GREATERTHANN_HPP
好了,现在可以通过编译了。
你可以从上面std::not1文档的Example代码看出,operator()是加了const属性的,因此这个地方是书的作者写错了。
ERROR C3848:具有类型"const XXX" 的表达式会丢失一些 const-volatile 限定符以调用"YYY" with"ZZZ"的更多相关文章
- ISO/IEC 9899:2011 条款6.7.3——类型限定符
6.7.3 类型限定符 语法 1.type-qualifier: const restrict volatile _Atomic 约束 2.除了指针类型(其被引用的类型是一个对象类型)之外的类型,不应 ...
- C语言中类型限定符
通常用类型和存储类别来描述一个变量. C90还增加了两个属性:恒常性(constancy).易变性(volatility): 分别用关键字const和volatile来声明. 这两个关键字创建的类型是 ...
- C 类型限定符
C 类型限定符 1. Introduction C 语言中的大部分类型都可以用称为限定符(qualifier)的关键字 const. volatile. restrict. _Atomic 加以限定. ...
- 类型限定符volatile
目录 类型限定符volatile 强制内存读取 禁止编译优化 注意:volatile不能够保证线程同步 volatile bool flag; volatile int a; 添加volatile限定 ...
- C#调用Excel报 error CS1969: 找不到编译动态表达式所需的一个或多个类型。是否缺少引用?
转自[http://blog.csdn.net/bodybo/article/details/43191319] 程序需要读取Exel文件,有如下代码段 object oMissing = Syste ...
- c语言的类型、运算符与表达式
title: 2017-10-17c语言的类型.运算符与表达式 tags: c程序设计语言 grammar_cjkRuby: true --- 1.1 数据类型 char 字符型,一个字节 int 整 ...
- 变量和基本类型——复合类型,const限定符,处理类型
一.复合类型 复合类型是指基于其他类型定义的类型.C++语言有几种复合类型,包括引用和指针. 1.引用 引用并非对象,它只是为一个已存在的对象所起的另外一个名字. 除了以下2种情况,其他所有引用的类型 ...
- const限定符、constexpr和常量表达式------c++ primer
编译器将在编译过程中把用到const变量的地方都替换成对应的值,为了执行这种替换,编译器必须知道变量的初始值.如果程序包含多个文件,则那个用了const对象的文件都必须能访问到它的初始值才行.要做到这 ...
- 2变量与基本类型之const限定符
一.const介绍: const对象一旦被创建其值就不能再改变,所以const对象必须初始化.任何试图对const赋值的行为都会引发错误. 二.初始化和const: 对const对象的主要限制就是只能 ...
随机推荐
- C#使用DirectShow播放视频文件 [转]
原文网址:http://blog.csdn.net/openzpc/article/details/48442751 最近在开发一个视频播放软件,主要要求就是循环播放多个视频文件,并且要求两个视频文件 ...
- 学会自己写jQuery插件(二)---自己写的tab插件
通过上一个基础篇我们知道插件的格式,这次我来写一个tab插件 $(function() { $.fn.插件名称 = function(options) { var defaults = { Event ...
- java实现顺序链表
C&C++是那么难学,以至于我连指针是什么都不知道.所以只能学习java了. 如今想用java实现N年前学过“数据结构(c语言版)”却又是那么吃力! 慢慢练吧! 写此博客,仅标记自己学过数据结 ...
- Arrays.asList的用法
使用工具类Arrays.asList()把数组转换成集合时,不能使用其修改集合相关的方法,它的add/remove/clear方法会抛出UnsupportOperationException异常说明: ...
- MySQL 工具
MySQL 客户端工具: 1:mysql #mysql的功能和Oracle的sqlplus一样,它为用户提供一个命令行接口来管理Mysql服务器. 2:mysqladmin #mysqla ...
- MySQL主从架构之Master-Slave主从同步
MySQL复制 MySQL复制是指将主库上的DDL和DML操作通过二进制日志传到从库上,使主库和从库上的数据保持同步 复制原理: 主服务器将更新写入二进制日志文件,并维护文件的一个索引来跟踪日志循环. ...
- JavaWeb 发送get请求
JavaWeb 发送get请求 CreationTime--2018年6月20日15点27分 Author:Marydon 1.前提 通过HttpClient来实现 2.具体实现 客户端如何发送请 ...
- 【Oracle】PL/SQL Developer 快捷键、使用技巧
1.类SQL PLUS窗口:File->New->Command Window,这个类似于oracle的客户端工具sql plus,但比它好用多了. 2.设置关键字自动大写:Tools-& ...
- LoadRunner利用ODBC编写MySql脚本(转)
LoadRunner测试数据库是模拟客户端去连接数据库服务器,因此,需要协议(或者说驱动的支持).LoadRunner本身直接支持Oracle.SqlServer数据库,这两个数据库直接选择相应的协议 ...
- Android软件开发之EditText 详解
EditText在API中的结构 java.lang.Objectandroid.view.Viewandroid.widget.TextView android.widget.Edit ...