我遇到了以下问题。我有一个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>
并在其上定义了一个比较操作,以使{{ 1}}可以排序,而无需修改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;
};
添加到Move类中,即使在那之后我仍然无法编译程序。
下面是我认为最重要的错误。
< operator
我正在使用: 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
,但问题仍未解决。这是编译器的屏幕截图,
答案 0 :(得分:3)
您的包装器类应类似于:
JiraCustomField
但是使用自定义比较器似乎更好(干扰较小)。
template <typename T>
struct Wrapper{
Wrapper(const T & pair): pair_mem(pair) {}
bool operator <(const Wrapper& rhs) const {
return pair_mem.first < rhs.pair_mem.first;
}
T pair_mem;
};
答案 1 :(得分:1)
如果最近使用的是c ++编译器,则可以使用lambda:
std::sort(std::begin(x), std::end(x), [](auto & l, auto & r) {return l.first < r.first; });
答案 2 :(得分:1)
当编译器吐出错误时,不要跳过第一条消息。从图像中(您确实应该复制了文本而不是创建图像):
错误:没有构造函数
Wraper<T>::Wraper
的实例与参数列表匹配vector(size_type __n, const value_type& __value = value_type()
错误(在下一行由插入号指示)发生在value_type()
。您输入到问题中的消息不是错误,而是解释了编译器为查找缺少的构造函数而尝试执行的操作。他们列出了为struct
尝试过的value_type
和找到的构造函数,它们采用了T
参数。这不匹配,因为编译器正在寻找默认构造函数(无参数)。
大概是在search-abid_parallel.cpp
的第137行,您使用指定向量初始大小的构造函数来声明包装类的向量。 (此外,基于错误消息,C ++ 11之前的版本?)此构造函数需要能够默认构造那些初始元素。定义其他构造函数时,默认构造函数被取消显示,因此会出现错误。
一些选项:
默认初始化向量,如果要在构建向量时避免重新分配,请调用reserve()
。
为包装器类定义默认的构造函数。
不要使用包装器类。而是给std::sort
(不使用C ++ 20执行策略时的第三个参数)提供比较功能。
不要使用向量。 std::multimap
将存储您的货币对并为您排序。