我有一个类似于以下的课程。我正在使用需要比较器作为模板参数的boost库的配对堆。我的比较器应该访问数据和A类成员进行比较。最初,我将'my_compare'声明为struct并重载了()运算符。但是除非将类A的指针('this')传递给它,否则结构无法访问类A的数据。但这意味着my_compare不再是编译时常量,它会产生错误:'this'不能出现在常量表达式中。
作为第二次尝试,我将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;
}
答案 0 :(得分:2)
首先要做的事情是:my_compare
函数 必须是一个独立的函数,或 static
。在你的情况下,真的没办法。
但是,如果您确实需要访问A
类中的成员,那么您可以将c
结构中的指针指向A
实例:
struct c
{
A* a;
// Other members
};
然后,当您创建c
对象时,将a
指针设置为this
。
答案 1 :(得分: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;
}
答案 2 :(得分: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)
那样构造它。
注意,你必须让内部类成为朋友,它不是自动的。您可以声明它,使它成为朋友并定义它,或者您可以定义它,使它成为朋友,但是您必须将操作员体放在类之外。