1

次のようなクラスがあります。テンプレート引数としてコンパレーターを必要とするブースト ライブラリのペアリング ヒープを使用しています。私のコンパレータは、比較を行うためにクラス A のデータとメンバーにアクセスする必要があります。最初に、「my_compare」を構造体として宣言し、() 演算子をオーバーロードしました。しかし、クラス A へのポインタ ('this') が渡されない限り、構造体はクラス A のデータにアクセスできませんでした。しかし、それは my_compare がコンパイル時の定数ではなくなったことを意味し、エラーが発生します: 'this' cannot appear in constant expression.

2 回目の試行として、my_compare をメンバー関数として宣言しました (メンバーとデータにアクセスできるようにするため)。次のエラーが表示されます:

error: type/value mismatch at argument 1 in template parameter list for 
‘template<class T> struct boost::heap::compare’

「my_compare」は(関数)オブジェクトではなく、「this」が暗黙的に渡されるため、バイナリ関数ではありません。この問題を解決するにはどうすればよいですか。

class A{
public:
  //some data(properties)
  struct c{
    //some data  
  };
  double method1(int variable);
  double method2(const struct c&);

  bool my_compare(struct c& c, struct c& d){
     //accesses member methods and data    
  }

  typedef boost::heap::pairing_heap<struct c, boost::heap::compare<my_compare> > myheap;

}
4

3 に答える 3

2

A*内部に保管する必要がありcます。おそらく次のようになります。

class A{
public:
  //some data(properties)
  struct c{
    //some data  
    A* owner_A;
    c(A* a) : owner_A(a) {}
  };
  double method1(int variable);
  double method2(const struct c&);

  static bool my_compare(struct c& c, struct c& d){
     //accesses member methods and data  
     c->owner_A->method1(42);  
     d->owner_A->method2(d); 
  }

  typedef boost::heap::pairing_heap<struct c, boost::heap::compare<my_compare> > myheap;

}
于 2013-08-07T09:09:47.937 に答える
2

ファンクターを使用する必要があります。

class A {
    struct my_compare;
    friend struct my_compare;
    struct my_compare {
        A &self;
        A(A &self) : self(self) {}
        bool operator()(struct c& c, struct c& d) {
            // access member data and methods on self
        }
    };
}

もちろん、使用する インスタンスを指定する必要があるため、ヒープを構築するときAと同様に構築する必要があります。my_compare(*this)

内部クラスをフレンドにする必要があることに注意してください。これは自動ではありません。宣言してフレンドにして定義するか、定義してフレンドにすることができますが、演算子本体をクラスの外に置く必要があります。

于 2013-08-07T09:17:01.427 に答える