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[] = { 10, 1, 2, 30, -10, -9, 3 };
    const size_t SIZE = sizeof a / sizeof a[0];

    gt_n<int> predicate(2);
    cout << "gt_n.getVal() = " << predicate.getVal() << endl;

    cout << count_if(a, a + SIZE, not1(predicate)) << endl; // 3
    return 0;
} ///:~

编译时报错

: 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属性的,因此这个地方是书的作者写错了。

时间: 2024-10-17 01:53:11

ERROR C3848:具有类型"const XXX" 的表达式会丢失一些 const-volatile 限定符以调用"YYY" with"ZZZ"的相关文章

sig_atomic_t类型与volatile限定符

volatile:防止编译器优化 代码:   1 #include<stdio.h>   2 #include<signal.h>   3 int a=0;   4 void signal_handler(int signal)   5 {   6     printf("signal is coming\n");   7     a=1;   8 }   9 int main()  10 {  11     signal(2,signal_handler);

C#调用Excel报 error CS1969: 找不到编译动态表达式所需的一个或多个类型。是否缺少引用?

转自[http://blog.csdn.net/bodybo/article/details/43191319] 程序需要读取Exel文件,有如下代码段 [csharp] view plaincopy object oMissing = System.Reflection.Missing.Value; Microsoft.Office.Interop.Excel.Application excelApp = new Microsoft.Office.Interop.Excel.Applicati

C++ Primer 学习笔记_15_从C到C++(1)--bool类型、const限定符、const与#define、结构体内存对齐

欢迎大家阅读参考,如有错误或疑问请留言纠正,谢谢 一.bool类型(C语言没有) 1.逻辑型也称布尔型,其取值为true(逻辑真)和false(逻辑假),存储字节数在不同编译系统中可能有所不同,VC++中为1个字节. 2.声明方式:bool result; result=true; 3.可以当作整数用(true一般为1,false为0) 4.把其它类型的值转换为布尔值时,非零值转换为true,零值转换为false 5.示例 #include <iostream> using namespace

《C程序设计语言(第2版&#183;新版)》第2章 类型、运算符与表达式

类型:决定对象可取值的集合以及可执行的操作:运算符指定操作:表达式把变量和常量组合起来生成新值. ANSI C修补:所有整型都包括signed和unsigned两种:浮点运算可单精度还可long double类型运算:字符串可以编译时连接:支持枚举类型:const类型:扩充算术类型的自动强制类型转换规则 2.1 变量名 将下划线看做字母:变量名是以字母开头的字母数字序列:库函数名字通常以下划线开头,不要用:区分大小写:传统上变量名用小写,符号常量名全大写,局部变量(尤其循环控制变量)一般短名,外

ssm整合时出现 org.springframework.beans.factory.BeanCreationException :Error creating bean with name ‘XXX’ 异常的原因及解决方法

ssm整合时出现 org.springframework.beans.factory.BeanCreationException :Error creating bean with name 'XXX' 异常的原因及解决方法(只是可能出现下列几种,不包含全部) 此异常为:注入 bean 失败异常,也就是找不到注入的bean. 可能有以下几种原因: 1.bean未注解或者注解错误 2.项目整合的时候jar包冲突 3.'XXX'的配置有错误 解决:1,3仔细检查就是,网上大部分的人应该是2这种错误,

error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int

1 #include<iostream> 2 using namespace std; 3 4 5 extern int i; 6 extern float f(float a); 7 float b; 8 float f(float a){ 9 return a+1.0; 10 } 11 int i; 12 int h(int x) 13 { 14 return x*i; 15 } 16 17 main() 18 { 19 b=1.0; 20 i=2; 21 f(b); 22 h(i); 2

[转]&quot;error while loading shared libraries: xxx.so.x&quot; 错误的原因和解决办法

[转]"error while loading shared libraries: xxx.so.x" 错误的原因和解决办法 http://blog.csdn.net/sahusoft/article/details/7388617 一般我们在Linux下执行某些外部程序的时候可能会提示找不到共享库的错误, 比如: tmux: error while loading shared libraries: libevent-1.4.so.2: cannot open shared obje

error: C2664: “zajiao::zajiao(const zajiao &amp;)”: 无法将参数 1 从“const char [12]”转换为“char *”

原本打算用一个字符串"ABCDEF12345"作为类zajiao的构造函数的参数,用来创建类zajiao的对象zajiao1. 1 zajiao zajiao1("ABCDEF12345"); 结果提示: F:\Users\denggelin\Documents\qtduojicheng\main.cpp:31: error: C2664: “zajiao::zajiao(const zajiao &)”: 无法将参数 1 从“const char [12]

const 不兼容的类型限定符问题

今天遇到一个问题,const对象调用成员函数的时候提示"不兼容的类型限定符"问题,查了一些资料,解决办法: 在成员函数后面加上 const关键字,例如: int get() const { return x; } 更进一步的原因是:const限定的对象以及其引用只能调用const限定的成员函数. const限定代表变量的值不会发生改变,要想不改变变量的值则只能调用const修饰的成员函数. 之前没有注意,mark一下.