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

SNIPPET 2(コンパイルエラー)

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

CODE SNIPPET 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;
  }
4

3 に答える 3

5

S5.1.2.5を参照してください。

ラムダ式のクロージャ型には、パブリックインライン関数呼び出し演算子(13.5.4)があり、そのパラメーターと戻り型は、それぞれラムダ式のparameter-declaration-clauseとtrailingreturn-typeによって記述されます。この関数呼び出し演算子は、lambdaexpressionのparameter-declaration-clauseの後にmutableが続かない場合にのみ、const(9.3.1)として宣言されます。それは仮想でも揮発性であると宣言されていません。デフォルトの引数(8.3.6)は、lambdadeclaratorのparameter-declaration-clauseで指定してはなりません。ラムダ式で指定された例外仕様は、対応する関数呼び出し演算子に適用されます。lambda-declaratorのattribute-specifier-seqは、対応する関数呼び出し演算子の型に関係します。[ ノート:lambda-declaratorで参照される名前は、lambda-expressionが表示されるコンテキストで検索されます。—エンドノート]

基本的に、生成されるファンクターのoperator()はconstデフォルトであり、値によってキャプチャされており、このキャプチャされた変数は生成されたファンクターのメンバーです。

したがって、2つのオプションがあります。

  1. 値ではなく、参照によってキャプチャします。
  2. ラムダを次のように変更します(mutable次のパラメーター宣言句に注意してください)。

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

于 2013-03-25T18:58:07.590 に答える
3

述語関数(の3番目の引数std::remove_if)はオブジェクトを変更できません。イテレータで呼び出されるすべてのメソッドはである必要がありますconstこのドキュメントを参照してください:

関数はその引数を変更してはならない。

値またはポインタのコピーを返す場合は、に設定できgetTipcAddressます。constconst

于 2013-03-25T15:27:37.763 に答える
0

つまり、この場合、constインスタンスでnon-constメソッドを呼び出すため、このエラーが発生します。isconstですが、non-constメソッドsrEndPointAddrを呼び出しますgetTipcAddress。解決策は、このメソッドconstを宣言することです。これは、単純なゲッターのようであり、おそらくオブジェクトを変更しないためです。

于 2013-03-25T15:21:32.963 に答える