C++ 在 unique_ptr 的映射上迭代 std::accumulate():没有已知的转换
C++ iterating std::accumulate() over a map of unique_ptr: no known conversion
这可能是星期五下午失明的情况...为什么地图上的累积不起作用。它给我一个编译错误
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>>
复制构造(并绑定到参数 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();
};
您也可以使用 member types of 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();
};
这可能是星期五下午失明的情况...为什么地图上的累积不起作用。它给我一个编译错误
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>>
复制构造(并绑定到参数 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();
};
您也可以使用 member types of 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();
};