如何将 std::unordered_map 部分特化为我的模板化 class 的成员?

How to partially specialize std::unordered_map as a member of my templated class?

我似乎无法理解为什么这不起作用:

#include <unordered_map>
#include <vector>

template<typename T>
struct Bar {
    Bar(const T &t) : x{t} {}
    T x;
};

template<typename T>
struct Foo {
    std::unordered_map<T, Bar<T>> u;

    Foo(const std::vector<T> &v) {
        for (const T &i : v)
            u[i] = Bar(i);
    }    
};

int main() {
    Foo<int> f({1, 2, 3});
}

Try it here

我想要的是有一个包含 unordered_map 的 Foo 实例,它将 T 类型的对象映射到 Bar 类型的对象。不幸的是,错误消息没有我希望的那么有用: error: no matching function for call to 'Bar<int>::Bar()'

这里发生了什么?我该如何解决这个问题?

正如@songyuanyao 非常聪明地注意到的那样,问题在于 std::unordered_map::operator[] returns 对映射类型的引用,这需要一个不带参数的构造函数。使用 std::unordered_map::insert 无需在 bar:

中引入此类构造函数即可解决此问题
#include <unordered_map>
#include <vector>

template<typename T>
struct Bar {
    Bar(const T &t) : x{t} {}
    T x;
};

template<typename T>
struct Foo {
    std::unordered_map<T, Bar<T>> u;

    Foo(const std::vector<T> &v) {
        for (const T &i : v)
            u.insert({i, Bar<T>(i)});
    }    
};

int main() {
    Foo<int> f({1, 2, 3});
}

Try it here