有语句编译器不能通过。我无法理解。谁能详细告诉我或者如何解决?向你致以最良好的祝愿。
声明如下:
std::priority_queue<int,std::vector<int>,[](const int& lhs,const int& rhs)
{
return lhs<rhs;
} > pq;
Run Code Online (Sandbox Code Playgroud)
编译器给出的信息如下:
type/value mismatch at argument 3 in template parameter list for
'template<class _Tp, class _Sequence, class _Compare> class std::priority_queue'
Run Code Online (Sandbox Code Playgroud)
cppreference 站点中引入的 std::priority_queue:http : //en.cppreference.com/w/cpp/container/priority_queue
主要结构如下:
template<
class T,
class Container = std::vector<T>,
class Compare = std::less<typename Container::value_type>
> class priority_queue;
Run Code Online (Sandbox Code Playgroud)
您显示的声明有一个值,即 lambda,作为实际模板参数,其中正式模板参数(参数)是一种类型。
这是使用类型作为模板参数的示例:
#include <vector>
#include <queue>
auto main()
-> int
{
struct My_less
{
auto operator()( int const a, int const b ) const
-> bool
{ return a < b; }
};
std::priority_queue< int, std::vector<int>, My_less > pq;
}
Run Code Online (Sandbox Code Playgroud)
使用 lambda 表达式作为比较器的示例:
#include <vector>
#include <queue>
auto main()
-> int
{
std::priority_queue< int, std::vector<int>, auto(*)(int,int)->bool > pq{
[]( int a, int b )->bool { return a < b; }
};
}
Run Code Online (Sandbox Code Playgroud)
C++11 §5.1.12/19 说“与 lambda 表达式关联的闭包类型有一个删除的 (8.4.3) 默认构造函数和一个删除的复制赋值运算符。”。这意味着 lambda 表达式的类型不能用于从头开始实例化 lambda。并且 lambda 不会隐式转换为std::less<T>
预期的,这意味着您也不能直接将它用作构造函数参数(无论如何std::less
都是无状态的)。但是您可以指定 lambda 转换为的比较器类型,然后使用 lambda 作为构造函数参数。在上面的代码中,比较器类型是一个简单的原始函数指针。
在实践中,在别处定义 lambda 函数并将它们作为函数指针传递给目标函数很有用
#include <vector>
#include <functional>
#include <queue>
void foo(std::function<bool(int &a, int &b)> comparison)
{
std::priority_queue< int, std::vector<int>, decltype(comparison)> pq {
comparison
};
}
auto main()
-> int
{
auto comparison = [](int,int)->bool {
return a < b;
}
foo(Comparison);
}
Run Code Online (Sandbox Code Playgroud)
如前所述,问题在于模板的第三个参数需要type,而不是value。
但是,从 C++20 开始,非捕获 lambda 是默认可构造的。由于每个 lambda 都有一个独特的类型,这意味着以下内容将起作用:
std::priority_queue<int, std::vector<int>, decltype([](int lhs, int rhs) {
return lhs < rhs;
})> pq;
// use pq like normal
Run Code Online (Sandbox Code Playgroud)
如果你需要经常使用这个特殊的比较,你可以 typedef 它:
using my_pqueue = std::priority_queue<int, std::vector<int>, decltype([](int lhs, int rhs) {
return lhs < rhs;
})>;
// ...
my_pqueue a; // don't need to pass in the lambda to the constructor
my_pqueue b;
Run Code Online (Sandbox Code Playgroud)
现场示例:https : //godbolt.org/z/cG3P4Y
归档时间: |
|
查看次数: |
3333 次 |
最近记录: |