1

以下の最初のコード スニペットでは、std::remove 関数に渡された静的条件関数に基づいて、メンバー関数内のベクトルから要素を削除しようとしています。次に、2 番目のスニペットに示すように、多くのテンプレート エラーが表示されます。私が欠けているものを教えてください。

スニペット 1 (コード)

void removeVipAddress(std::string &uuid)
{
          struct RemoveCond
          {
            static bool condition(const VipAddressEntity & o)
            {
              return o.getUUID() == uuid;
            }
          };

          std::vector<VipAddressEntity>::iterator last =
            std::remove(
                    mVipAddressList.begin(),
                    mVipAddressList.end(),
                    RemoveCond::condition);

          mVipAddressList.erase(last, mVipAddressList.end());

}

スニペット 2 (コンパイル出力)

 /usr/include/c++/4.7/bits/random.h:4845:5: note: template<class _IntType> bool      std::operator==(const std::discrete_distribution<_IntType>&, const   std::discrete_distribution<_IntType>&)
 /usr/include/c++/4.7/bits/random.h:4845:5: note:   template argument deduction/substitution failed:
 In file included from /usr/include/c++/4.7/algorithm:63:0,
             from Entity.hpp:12:
 /usr/include/c++/4.7/bits/stl_algo.h:174:4: note:   ‘ECLBCP::VipAddressEntity’ is not  derived from ‘const std::discrete_distribution<_IntType>’
 In file included from /usr/include/c++/4.7/random:50:0,
               from /usr/include/c++/4.7/bits/stl_algo.h:67,
               from /usr/include/c++/4.7/algorithm:63,
               from Entity.hpp:12:
 /usr/include/c++/4.7/bits/random.h:4613:5: note: template<class _RealType> bool  std::operator==(const std::extreme_value_distribution<_RealType>&, const  std::extreme_value_distribution<_RealType>&)
 /usr/include/c++/4.7/bits/random.h:4613:5: note:   template argument deduction/substitution failed:
 In file included from /usr/include/c++/4.7/algorithm:63:0,
             from Entity.hpp:12:
 /usr/include/c++/4.7/bits/stl_algo.h:174:4: note:   ‘ECLBCP::VipAddressEntity’ is not  derived from ‘const std::extreme_value_distribution<_RealType>’
4

1 に答える 1

4

std::remove_if()ではなく、を探していると思いますstd::remove()

std::remove_if()3 番目の引数として述語を受け入れ、その述語を満たす要素を削除します。

std::remove()3 番目の引数として値を取り、その値に等しい要素を削除します。

編集

これを機能させるには、RemoveCond状態が必要なため、定義を述語オブジェクトに変換する必要もあります。このような:

void removeVipAddress(std::string &uuid)
{
      struct RemoveCond : public std::unary_function<VipAddressEntity, bool>
      {
        std::string uuid;

        RemoveCond(const std::string &uuid) : uuid(uuid) {}

        bool operator() (const VipAddressEntity & o)
        {
          return o.getUUID() == uuid;
        }
      };

      std::vector<VipAddressEntity>::iterator last =
        std::remove(
                mVipAddressList.begin(),
                mVipAddressList.end(),
                RemoveCond(uuid));

      mVipAddressList.erase(last, mVipAddressList.end());

}
于 2013-02-22T13:14:47.027 に答える