为什么我不能用谓词的实例化构造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)));
否则,它将被解释为函数的声明,返回您的集合类型并采用名为ProxySorter
的cost
类型的参数。
以上是关于为什么我不能用谓词的实例化构造std :: set,但我可以指定一个构造的std :: set吗?的主要内容,如果未能解决你的问题,请参考以下文章