4

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

std::vector<EndPointAddr*> mKnownSRList;

我收到代码片段 2 中显示的编译错误。您能告诉我这段代码有什么问题吗?getTipcAddress() 和 compareTo 函数的内容如下面的代码片段 3 和 4 所示。

CODE SNIPPET 1(标记编译错误)

void 
ServiceRegistrarAPI::removeKnownSR(EndPointAddr & srEndPointAddr)
{
   auto last = 
   std::remove_if(mKnownSRList.begin(),
                  mKnownSRList.end(),
                 [srEndPointAddr]( EndPointAddr* o )
                 { 
                    //LINE 355 is the following
            EndPointTipcAddr myTipcAddress = srEndPointAddr.getTipcAddress();
                EndPointTipcAddr otherTipcAddress = o->getTipcAddress();

            return (myTipcAddress.compareTo(otherTipcAddress));
         });

    if(*last != nullptr)
    {
     delete *last;
    }

    mKnownSRList.erase(last, mKnownSRList.end());    
}

片段 2(编译错误)

  ServiceRegistrarAPI.cpp:355:72: error: passing ‘const EndPointAddr’ as ‘this’   argument of ‘EndPointTipcAddr& EndPointAddr::getTipcAddress()’ discards qualifiers [-  fpermissive]

代码片段 3(getTipcAddress 函数)

EndPointTipcAddr & getTipcAddress() { return mTipcAddress; }

CODE NIPPET 4(比较功能)

  bool

  EndPointTipcAddr::compareTo(EndPointTipcAddr &rhs) 
  {     
      if( (mType == rhs.getType()) && (mInstanceNo == rhs.getInstanceNo()) )
      {
        return true;
      } 

      return false;
  }
4

3 回答 3

5

见 S5.1.2.5:

lambda 表达式的闭包类型具有公共内联函数调用运算符 (13.5.4),其参数和返回类型分别由 lambda 表达式的参数声明子句和尾随返回类型描述。当且仅当 lambda 表达式的 parameter-declaration-clause 后面没有 mutable 时,此函数调用运算符才被声明为 const (9.3.1)。它既不是虚拟的,也不是声明为 volatile 的。默认参数 (8.3.6) 不应在 lambda 声明符的参数声明子句中指定。在 lambda 表达式上指定的任何异常规范都适用于相应的函数调用运算符。lambda-declarator 中的属性说明符序列属于相应函数调用运算符的类型。[ 笔记:在 lambda-declarator 中引用的名称在 lambda-expression 出现的上下文中查找。——尾注]

基本上,这意味着默认情况下生成的函子的 operator() 是const按值捕获的,并且这个捕获的变量是生成的函子的成员。

所以,你有两个选择:

  1. 通过引用而不是按值捕获。
  2. 将您的 lambda 更改为以下内容(注意mutable以下参数声明子句):

    [srEndPointAddr](EndPointAddr* o) mutable { ... }

于 2013-03-25T18:58:07.590 回答
3

谓词函数(的第三个参数std::remove_if)不允许修改对象。迭代器上调用的所有方法都必须是const. 请参阅此文档

该函数不得修改其参数。

如果要返回值或指针的副本,则可以设置getTipcAddress为。constconst

于 2013-03-25T15:27:37.763 回答
0

简而言之,您会收到此错误,因为在这种情况下您在 const 实例上调用了非常量方法:srEndPointAddris const 但您getTipcAddress在其上调用了非常量方法。您的解决方案是声明此方法 const ,因为它似乎是一个简单的 getter 并且可能不会修改对象。

于 2013-03-25T15:21:32.963 回答