为什么我不能用谓词的实例化构造std :: set,但我可以指定一个构造的std :: set吗?

Rob*_*lly 8 c++ constructor stl predicate set

所以我有一个数组(0 - n),保存我希望std :: set用于它的排序的值.数组是unsigned int cost [n].

我正在使用以下仿函数进行此排序:

struct ProxySorter {
  ProxySorter(const unsigned* arr) : proxy_array(arr) {}
  bool operator()(const unsigned& a, const unsigned& b) const {
    return proxy_array[a] < proxy_array[b];
  }
  const unsigned* proxy_array;
};
Run Code Online (Sandbox Code Playgroud)

所以这就是问题......当我构建集合时,这是合法的:

std::set<unsigned, ProxySorter> node_queue = std::set<unsigned, ProxySorter>(ProxySorter(cost));
Run Code Online (Sandbox Code Playgroud)

我没有错误,一切都按预期工作.但这似乎是黑客和草率.

但是,这显然是非法的:

std::set<unsigned, ProxySorter> node_queue(ProxySorter(cost));
Run Code Online (Sandbox Code Playgroud)

试图用ProxySorter(成本)构造它会导致一堆错误,为每个set成员调用说这样的东西:

错误:在node_queue中请求成员擦除,这是非类型类型std :: set <unsigned int,ProxySorter>(ProxySorter)

常规施工有什么问题?为什么作业有效?我错过了什么区别?任何帮助非常感谢,谢谢.

哦,抱歉问题的标题,我不知道该怎么称呼它.

Xeo*_*Xeo 13

最烦恼的解析.你需要另外一对括号:

std::set<unsigned, ProxySorter> node_queue((ProxySorter(cost)));
Run Code Online (Sandbox Code Playgroud)

否则,它将被解释为函数的声明,返回您的集合类型并采用ProxySorter名为的类型的参数cost.