【问题标题】:C++ iterating std::accumulate() over a map of unique_ptr: no known conversionC ++在unique_ptr的映射上迭代std :: accumulate():没有已知的转换
【发布时间】:2020-06-12 09:42:33
【问题描述】:

这可能是周五下午失明的情况...为什么地图上的累积不起作用。它给我一个编译错误

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;
}

【问题讨论】:

    标签: c++ c++14 stdmap


    【解决方案1】:

    std::map 的value_type 是std::pair&lt;const Key, T&gt;;请注意,密钥被限定为const。所以对于std::map&lt;std::string, std::unique_ptr&lt;Foo&gt;&gt;,value_type 是std::pair&lt;const std::string, std::unique_ptr&lt;Foo&gt;&gt;,但不是std::pair&lt;std::string, std::unique_ptr&lt;Foo&gt;&gt;。由于std::unique_ptr,临时的std::pair&lt;const std::string, std::unique_ptr&lt;Foo&gt;&gt; 不能从std::pair&lt;std::string, std::unique_ptr&lt;Foo&gt;&gt; 复制构造(并绑定到参数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();
    };
    

    【讨论】:

    • 不是周五下午的失明……我不知道。非常感谢。本周仍然学到了一些东西。我想“汽车”让我度过了迄今为止的生活,而不必知道这一点;)
    • @chrise 你也可以直接使用value_type,如果你觉得记住这样的细节很无聊。 (但我仍然建议你记住它们。:))
    • 为什么是const map_t::value_type &amp; 而不是map_t::const_reference?
    • @Caleth 不错的选择;已添加。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多