C++ C++;复杂情况下的比较器传递参数问题

C++ C++;复杂情况下的比较器传递参数问题,c++,c++11,C++,C++11,我有一个类A,其中有一个类B的成员变量。在B中,有一个优先级队列“q”的成员变量,我想为它定义一个定制的比较器类C。但是对于比较器,比较需要一个来自a的成员变量“f_val”。请注意,这些“f_val”是同一个对象,我将用一个共享指针替换它们,但我不打算在这里讨论 由于原始代码很长,基本思想如下: class C { map<Point,double> f_val; C(double f_val1) { f_val=f_val1; } bool opera

我有一个类A,其中有一个类B的成员变量。在B中,有一个优先级队列“q”的成员变量,我想为它定义一个定制的比较器类C。但是对于比较器,比较需要一个来自a的成员变量“f_val”。请注意,这些“f_val”是同一个对象,我将用一个共享指针替换它们,但我不打算在这里讨论

由于原始代码很长,基本思想如下:

class C
{
  map<Point,double> f_val;
  C(double f_val1)
  {
    f_val=f_val1;
  }
  bool operator () (const Point &pt1, const Point &pt2)
  {
    return f_val[pt1] > f_val[pt2];
  }

};



class A
{
    B b;
    map<Point,double> f_val;
}

class B
{
    B(map<Point,double> f_val1){f_val=f_val1;}
    priority_queue<Point,vector<Point>,C(f_val)> q;
    map<Point,double> f_val;
}
C类
{
地图f_val;
C(双f_val1)
{
f_val=f_val1;
}
布尔运算符()(常数点和pt1、常数点和pt2)
{
返回f_val[pt1]>f_val[pt2];
}
};
甲级
{
B B;
地图f_val;
}
B类
{
B(映射f_val1){f_val=f_val1;}
优先级队列q;
地图f_val;
}

我的问题是这不能被编译,因为f_val在传递到C()时不是静态的。那么如何解决这个问题呢?

除了指定自定义比较类型之外,您还可以。以任何适合您需要的方式构造
C
对象(确保它是可复制构造的),然后将其传递给
q
的构造函数


根据示例的状态(所有三个类都有一个
f_val
映射,并且没有指明哪一个是规范的),提供更具针对性的帮助有点困难。

除了指定自定义比较类型之外,您还可以。以任何适合您需要的方式构造
C
对象(确保它是可复制构造的),然后将其传递给
q
的构造函数

鉴于您的示例的状态(所有三个类都有一个
f_val
映射,并且没有指明哪一个是规范的),提供更具针对性的帮助有点困难。

如果您看到,例如,您将看到您可以将comparator对象作为参数传递

因此,解决方案是使用
B
构造函数初始值设定项列表来构造和初始化队列:

struct B
{
    map<Point, double>& f_val;
    priority_queue<Point, dequeue<Point>, C> q;

    B(map<Point, double>& f_val1)
        : f_val(f_val1), q(C(f_val1))
    {}
};
结构B { 地图&富瓦尔; 优先级队列q; B(地图和f_val1) :f_val(f_val1),q(C(f_val1)) {} };
正如您在上面的示例中所看到的,我使用了对地图的引用。在类
C
中也使用映射的引用,以避免复制和映射不同步的风险。

如果您看到,例如,您将看到可以将比较器对象作为参数传递

因此,解决方案是使用
B
构造函数初始值设定项列表来构造和初始化队列:

struct B
{
    map<Point, double>& f_val;
    priority_queue<Point, dequeue<Point>, C> q;

    B(map<Point, double>& f_val1)
        : f_val(f_val1), q(C(f_val1))
    {}
};
结构B { 地图&富瓦尔; 优先级队列q; B(地图和f_val1) :f_val(f_val1),q(C(f_val1)) {} };
正如您在上面的示例中所看到的,我使用了对地图的引用。在类
C
中使用地图参考,以避免复制和地图不同步的风险。

更新了我的问题:“注意这些“f_val”是同一个对象,我将用共享指针替换它们,但我不打算在这里讨论。”更新了我的问题:“注意这些”f_val“是同一个对象,我将用共享指针替换它们,但我不打算在这里讨论。”