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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么我不能用谓词的实例化构造std :: set,但我可以指定一个构造的std :: 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;
};

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

std::set<unsigned, ProxySorter> node_queue = std::set<unsigned, ProxySorter>(ProxySorter(cost));

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

但是,这显然是非法的:

std::set<unsigned, ProxySorter> node_queue(ProxySorter(cost));

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

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

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

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

答案

Most-vexing-parse。你需要另外一对括号:

std::set<unsigned, ProxySorter> node_queue((ProxySorter(cost)));

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

以上是关于为什么我不能用谓词的实例化构造std :: set,但我可以指定一个构造的std :: set吗?的主要内容,如果未能解决你的问题,请参考以下文章

为啥使用set注入,一定要给类提供一个无参的构造函数,否则Spring不能实例化类的.

C++11 std::declval实现机制随想

cython c++ 类继承不能实例化派生类

为啥我们需要私有构造函数?

C#:通过构造函数与实例化将数据分配给属性

核心数据:实例化后谓词为零