【发布时间】:2018-06-26 21:44:53
【问题描述】:
我遇到了以下问题。我有一个std::vector< std::pair<int, Move> > x 类型为std::pair<int, Move>,其中Move 是一个没有定义任何比较运算符的任意对象,例如< > !+ == <= >= 等等。
我将Move 对象与整数值配对的主要原因是Move 对象应该有一个数字来描述它们出于某种目的的优先级。主要目的是对向量进行排序,从而使用它们各自的整数值对 Move 对象进行排序。
当我想使用std::sort 函数对向量中的这些对进行排序时,真正的问题就开始了。最初我认为只有std::pair 的第一个元素对比较很重要,然而,结果证明这两个对象都需要为它们定义比较操作才能成功编译程序。
因为我不想修改原来的 Move 类,所以我编写了一个 Wrapper 类,它应该包装 std::pair<int, Move> 并在其上定义一个比较操作,以便可以对 std::vector< Wrapper < std::pair<int, Move> > > x; 进行排序而无需修改Move 类。这里的逻辑是vector 提供了一个定义了< 操作的类。
我使用了下面的包装类:
template <typename T>
struct Wrapper{
Wrapper(const T & pair): pair_mem(pair)
bool operator(const T & other_pair) const{
return this->pair_mem.first < other_pair.first;
}
T pair_mem;
};
好吧,您可能已经猜到上面的方法不起作用,我不得不经历一堆编译器错误。最后,我尝试将< operator 添加到 Move 类中,即使之后我也无法编译程序。
以下是我认为最重要的错误。
: note: this candidate was rejected because mismatch in count of arguments
struct Wraper{
^
: note: this candidate was rejected because mismatch in count of arguments
Wraper(const std::pair<int, Move> & move){
我使用mpiCC作为编译器
更新
我确实将T 更改为Wrapper 作为建议的答案之一,但问题没有解决。这是编译器的截图,
【问题讨论】:
-
您是否考虑过使用
std::map?它可以让你建立一个自动排序的键值关系。 -
我实际上更感兴趣的是我无法编译它的原因。
-
你能展示一下你是如何使用包装器来得到那个错误的吗(minimal reproducible example)?看起来this 可能会告诉你你需要什么。
-
std::vector< Wrapper < std::pair<int, Move> > > x;是编译错误的来源。Wrapper是一个定义了比较的类。它需要std::pair<int, Move> -
您可以将自己的比较函数传递给
std::sort。
标签: c++ c++11 templates compiler-errors