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

问题描述 投票:8回答:1

所以我有一个数组(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)

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

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

c++ stl constructor set predicate
1个回答
13
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.