Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 定义映射/集时如何实例化比较函数(函子)?_C++_Std_Functor_Multiset - Fatal编程技术网

C++ 定义映射/集时如何实例化比较函数(函子)?

C++ 定义映射/集时如何实例化比较函数(函子)?,c++,std,functor,multiset,C++,Std,Functor,Multiset,我正在使用funciton对象为map/set指定比较函数: struct CompareObject { bool operator()(Node* const n1, Node* const n2) const; }; 据我所知,这样定义一个集合不会创建任何CompareObject实例,而是会假装它是静态的: std::multiset<Node*, CompareObject> set; 因此,我在CompareObject定义中添加了一些字段: struct

我正在使用funciton对象为map/set指定比较函数:

struct CompareObject {
    bool operator()(Node* const n1, Node* const n2) const;
}; 
据我所知,这样定义一个集合不会创建任何CompareObject实例,而是会假装它是静态的:

std::multiset<Node*, CompareObject> set;
因此,我在CompareObject定义中添加了一些字段:

struct CompareObject {

  Tree& tree;              // added
  CompareObject(Tree& t);  // added

  bool operator()(Node* const n1, Node* const n2) const;
}; 
我遇到的问题是,我不知道如何用集合的定义来稳定这个对象

我首先想到的是:

std::multiset<Node*, CompareObjects(*this)> shapesMap; // not valid code
std::多集形状映射;//无效代码
但毫不奇怪,它给了我一个错误:“this”不能出现在常量表达式中


你知道如何解决这个问题吗?

你可以把函子的一个实例作为参数传递给集合构造函数。类似于
multiset shapeset(比较对象(myTree))

@msgmaxim我认为编译器可能正在将初始化解析为函数声明。尝试在CompareObject周围添加一组额外的括号:
multiset shapeset((CompareObject(myTree))。如果您使用的是C++11,还可以使用统一初始化:
shapeset{CompareObject{myTree}附加括号没有帮助,但统一初始化似乎解决了这个问题。顺便说一句,初始化列表也很好用!注意
Node*const n
Node-const*n
const-Node*n
之间的差异。在第一种情况下,
const
应用于指针,因此我们不能使
n
指向另一个对象,但可以更改此指针下的数据:
n->x=22
。第二和第三个符号不允许更改指针下的对象。您可能需要使用第二个或第三个变体。
std::multiset<Node*, CompareObjects(*this)> shapesMap; // not valid code