如何将std::unorderede_map部分专用化为模板化类的成员



我似乎不明白为什么这不起作用:

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

在这里试试

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

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

正如@songyuanyao非常聪明地注意到的那样,问题是std::unordered_map::operator[]返回对映射类型的引用,这需要一个不带参数的构造函数。使用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});
}

在这里试试

最新更新