簡體   English   中英

C++ 在 unique_ptr 的 map 上迭代 std::accumulate():無已知轉換

[英]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::mapvalue_typestd::pair<const Key, T> 請注意,密鑰被限定為const 所以對於std::map<std::string, std::unique_ptr<Foo>> value_typestd::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_typeconst_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM