[英]C++ iterating std::accumulate() over a map of unique_ptr: no known conversion
這可能是周五下午失明的情況......為什么map上的累積不起作用。 它給我一個編譯錯誤
main.cpp:35:80: note: no known conversion for argument 2 from ‘std::pair, std::unique_ptr >’ to ‘const std::pair, std::unique_ptr >&’
這個演員陣容有什么問題?
#include <vector>
#include <map>
#include <memory>
#include <numeric>
#include <iostream>
using namespace std;
struct Foo
{
long bar() const {return 1;}
};
int main()
{
std::vector<std::unique_ptr<Foo>> v;
auto baz = [](long x, const std::unique_ptr<Foo>& p){return x + p->bar();};
std::accumulate(v.begin(), v.end(), 0L, baz);
std::map<std::string, std::unique_ptr<Foo>> m;
auto bam = [](long x, const std::pair<std::string, std::unique_ptr<Foo>>& p) {
return x + p.second->bar();
};
std::accumulate(m.begin(), m.end(), 0L, bam);
return 0;
}
std::map
的value_type
是std::pair<const Key, T>
; 請注意,密鑰被限定為const
。 所以對於std::map<std::string, std::unique_ptr<Foo>>
value_type
是std::pair<const std::string, std::unique_ptr<Foo>>
,但不是std::pair<std::string, std::unique_ptr<Foo>>
。 由於std::unique_ptr
,臨時std::pair<const std::string, std::unique_ptr<Foo>>
不能從std::pair<std::string, std::unique_ptr<Foo>>
復制構造std::pair<std::string, std::unique_ptr<Foo>>
(並綁定到參數p
,其引用類型為const
)。
您可以更改 lambda 的參數類型以與value_type
完全匹配,然后可以直接綁定參數。
auto bam = [](long x, const std::pair<const std::string, std::unique_ptr<Foo>>& p) {
// ^^^^^
return x + p.second->bar();
};
您還可以使用std::map
的成員類型,例如value_type
或const_reference
。
auto bam = [](long x, const std::map<std::string, std::unique_ptr<Foo>>::value_type& p) {
return x + p.second->bar();
};
auto bam = [](long x, std::map<std::string, std::unique_ptr<Foo>>::const_reference p) {
return x + p.second->bar();
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.