为什么我不能用谓词的实例化来构造 std::set,但我可以分配一个以这种方式构造的 std::set?
Why can't I construct std::set with an instantiation of a predicate, but I can assign a std::set constructed that way?
所以我得到了一个数组(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(cost)构造它会导致一堆错误,对于每个set成员调用都说这样的东西:
error: request for member erase in node_queue,是of非类类型std::set
Most-vexing-parse。您需要另一对括号:
std::set<unsigned, ProxySorter> node_queue((ProxySorter(cost)));
否则,它将被解释为一个函数的声明,返回您的集合类型,并接受一个名为
cost
的ProxySorter
类型的参数。
相关文章:
- 在声明中合并两个常量"std::set"(不是在运行时)
- 有没有办法对std::unordered_set、std::unrdered_map、std::set、std::map
- 将 std::set 与基于键的比较器一起使用
- 修改"std::set"中用户定义类型的值
- 如何在构造函数参数中初始化"std::set"?
- 如何使用 lower_bound/upper_bound 从 std::set 获取索引号?
- 如何在 C++ 中转发声明 std::set?
- 重构使用动态强制转换的 std::set 的比较运算符
- 为什么 std::set.erase(first, last) 会影响从中获取 (first, last) 的容器?
- 将 std:set<int32_t> 复制到 std::set <uint32_t>的好方法
- 错误 C2676:std::set::const_iterator 没有运算符 + 函数?
- std::set 是否将对象连续存储在内存中?
- google test PrintTo for std::set<std::string>
- 不能对 std::set<std::string, std::less 使用用户提供的比较函数<>>
- "Flattening" std::set<std::string> 用于存储和比较?
- C++ std::map<std::string, std::set<std::string>> .如何循环设置值?
- 在std::set/std::map中存储具有多个不同类型字段的c++对象的有效方法
- 在C++中迭代 std::set<std::string> 时出现分段错误
- 从声明为 std::set<std::shared_ptr> edges_ 的edges_中删除边<Edge>;
- 将基于范围的 for 与 std::set<std::unique_ptr <T>一起使用>已删除函数