1. ホーム
  2. スクリプト・コラム
  3. その他

[解決済み】非静的メンバ関数の無効な使用 【重複あり

2021-12-31 09:07:41

質問

class Bar
      {
      public:
        pair<string,string> one;
        std::vector<string> cars;
        Bar(string one, string two, string car);
      };

class Car
      {
      public:
        string rz;
        Bar* owner;
        Car(string car, Bar* p);
      };

class Foo
       {
         public:
          Foo  ( void );
          ~Foo  ( void );
          int Count ( const string & one, const string &  two) const;
          int comparator (const Bar & first, const Bar & second) const;            
            std::vector<Bar> bars;
       };

int Foo::comparator(const Bar & first, const Bar & second) const{
  return first.name < second.name;
}

int Foo::Count  ( const string & one, const string & two ) const{
  int result=0;
  Bar mybar = Bar( one, two, "" );
  std::vector<Bar>::iterator ToFind = lower_bound(bars.begin(), bars.end(), mybar, comparator);
  if (ToFind != bars.end() && ToFind->one == mybar.one ){
    result = ...
  }
  return result;
}

メソッド Foo::Count を使用する必要があります。 std::lower_bound() にある要素を見つけるために vector<Bar> 2つの文字列のペアに従って さて、うまくいかない部分です。このような場合 lower_bound() メソッドを提供しています。 comparator() . 大丈夫かと思いきや、g++が言う。

c.cpp: In member function ‘int Foo::Count(const string&, const string&) const’:
c.cpp:42:94: error: invalid use of non-static member function
std::vector<Bar>::iterator ToFind = lower_bound(bars.begin(), bars.end(), mybar, comparator);

そして、そのメソッド Count() のままでなければなりません。 const ...

解決方法は?

を作成する必要があります。 Foo::comparator を静的に配置するか std::mem_fun クラスオブジェクトを作成します。これは lower_bounds() は、比較対象が関数ポインタやファンクタオブジェクトのような呼び出し演算子を持つオブジェクトのクラスであることを期待します。また、C++11以降を使用している場合は、次のようにすることもできます。 dwcanillas は、ラムダ関数を使用することを提案しています。また、C++11では std::bind もあります。

// Binding:
std::lower_bounds(first, last, value, std::bind(&Foo::comparitor, this, _1, _2));
// Lambda:
std::lower_bounds(first, last, value, [](const Bar & first, const Bar & second) { return ...; });