2013-03-25 59 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

相關問題