2013-03-25 120 views
4

在代码片段低于1,mKnownSRList定义如下:常量XX丢弃预选赛[ - fpermissive]

std::vector<EndPointAddr*> mKnownSRList; 

我得到的代码片段所示编译错误2.你能告诉我有什么不对的代码请? getTipcAddress()和compareTo函数的内容显示在下面的代码片段3和4中。

代码段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());  
} 

SNIPPET 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(的compareTo功能)

bool 

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

     return false; 
    } 
+2

没有详细考虑过这个,但我相信[这将是相关的( http://stackoverflow.com/questions/2835626/c0x-lambda-capture-by-value-always-const)。 – BoBTFish 2013-03-25 15:18:57

回答

3

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

函数不得修改其参数。

您可以设置getTipcAddressconst如果你是返回一个值的副本或const指针。

0

总之,因为你调用一个非const方法,在这种情况下,一个const比如你收到此错误:srEndPointAddr是常量,但你调用非const方法getTipcAddress就可以了。你的解决方案是声明这个方法为const,因为它看起来像一个简单的getter,并且可能不会修改该对象。

+0

但问题是,“为什么它是一个常量实例”? – juanchopanza 2013-03-25 15:25:52

+0

@juanchopanza嗯我想问题是如何解决这个错误。 – 2013-03-25 15:27:47

0

这是一个答案,如何解决问题,而不是为什么它使错误(感谢juanchopanza)

我猜你有一些问题与常量限定符。

添加const -qualified过载getTipcAddress

EndPointTipcAddr & getTipcAddress() const { return mTipcAddress; } 
            ~~~~~ 

和,在compareTo末尾添加const

bool EndPointTipcAddr::compareTo(EndPointTipcAddr &rhs) const 
                 ~~~~~ 
+0

但为什么这是必要的?这是问题(答案在重复)。 – juanchopanza 2013-03-25 15:26:14

5

见S5.1.2.5:

用于λ-表达的闭合类型有一个公共的内联函数 呼叫操作员(13.5.4),其参数和返回类型由氯氟描述 表达式的参数声明子句和 拖尾返回类型。这个函数调用操作符是 ,声明为const(9.3。1)当且仅当lambda表达式的 参数声明子句没有跟随可变。它既不是 虚拟也不是公开的volatile。缺省参数(8.3.6)不应该是在lambdadeclarator的parameter-declaration-clause中指定的 。 在lambda表达式上指定的任何异常规范都会将 应用于相应的函数调用操作符。 lambda声明器中的 attribute-specifier-seq属于相应函数调用操作符的类型 。 [注意:在lambda表达式中出现 lambda表达式的上下文中查找名称为 的名称。末端音符]

基本上,含义是,产生是const默认算符的运算符(),且已按值捕获,并且该拍摄变量是所生成的函子的成员。

所以,你已经两个选项:

  1. 捕捉参考,而不是由价值。
  2. 您的拉姆达变化以下(注意mutable参数声明条款如下):

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

+1

+ 1e6!最后有人解释了为什么它真的发生了,而不是一些曼波 - 詹博士的一切。 – 2013-03-25 21:32:30

相关问题