Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 常量XX丢弃限定符[-fppermissive]_C++_C++11 - Fatal编程技术网

C++ 常量XX丢弃限定符[-fppermissive]

C++ 常量XX丢弃限定符[-fppermissive],c++,c++11,C++,C++11,在下面的代码段1中,mKnownSRList的定义如下: std::vector<EndPointAddr*> mKnownSRList; 代码段2(编译错误) 代码片段3(GetTipAddress函数) EndPointTipcAddr & getTipcAddress() { return mTipcAddress; } 编码喷嘴4(与功能比较) 简而言之,之所以会出现此错误,是因为在本例中,您在一个const实例上调用了一个非const方法:srEndPointA

在下面的代码段1中,mKnownSRList的定义如下:

std::vector<EndPointAddr*> mKnownSRList;
代码段2(编译错误)

代码片段3(GetTipAddress函数)

EndPointTipcAddr & getTipcAddress() { return mTipcAddress; }
编码喷嘴4(与功能比较)


简而言之,之所以会出现此错误,是因为在本例中,您在一个const实例上调用了一个非const方法:
srEndPointAddr
是const,但您在它上调用了非const方法
getticpaddress
。您的解决方案是声明此method const,因为它似乎是一个简单的getter,并且可能不会修改对象。

谓词函数(如果
std::remove\u的第三个参数)不允许修改对象。在迭代器上调用的所有方法都必须是
const
。见:

函数不应修改其参数

如果返回值或
const
指针的副本,则可以将
getipcAddress
设置为
const

参见S5.1.2.5:

lambda表达式的闭包类型具有公共内联函数 呼叫操作员(13.5.4),其参数和返回类型如下所述 通过lambda表达式的参数声明子句和 分别为trailingreturn-type。此函数调用运算符为 声明常量(9.3.1)当且仅当lambdaexpression 参数声明子句后面没有可变的。两者都不是 虚拟或声明不稳定。默认参数(8.3.6)不应为 在lambdadecrator的参数声明子句中指定。 lambda表达式上指定的任何异常规范都适用 到相应的函数调用操作符。一 lambda声明符中的属性说明符seq与类型相关 对应函数调用运算符的。[注:参考名称] 在lambda声明器中,在 出现lambda表达式。-结束注释]

基本上,隐含的是生成的函子的运算符(),默认情况下,它是
const
,并且您已按值捕获,并且此捕获的变量是生成的函子的一个成员

因此,您有两种选择:

  • 通过引用而不是通过值捕获
  • 将lambda更改为以下值(注意参数声明子句后面的
    mutable
    ):

    [srEndPointAddr](EndPointAddr*o)可变{…}


  • 我没有详细考虑过这一点,但我相信。但问题是,“为什么它是一个常数实例”?@juanchopanza-hmm我认为问题是如何修复这个错误。+1e6!最后有人解释了为什么会发生这样的事,而不是其他任何事情。
      ServiceRegistrarAPI.cpp:355:72: error: passing ‘const EndPointAddr’ as ‘this’   argument of ‘EndPointTipcAddr& EndPointAddr::getTipcAddress()’ discards qualifiers [-  fpermissive]
    
    EndPointTipcAddr & getTipcAddress() { return mTipcAddress; }
    
      bool
    
      EndPointTipcAddr::compareTo(EndPointTipcAddr &rhs) 
      {     
          if( (mType == rhs.getType()) && (mInstanceNo == rhs.getInstanceNo()) )
          {
            return true;
          } 
    
          return false;
      }