【发布时间】:2021-06-20 01:20:22
【问题描述】:
我似乎无法理解为什么这不起作用:
#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 的实例,它包含一个 unordered_map,它将 T 类型的对象映射到 Bar 类型的对象。不幸的是,错误消息没有我希望的那么有用:
error: no matching function for call to 'Bar<int>::Bar()'
这里发生了什么?我该如何解决这个问题?
【问题讨论】:
-
std::map::operator[]要求value_type是 DefaultConstructible,而Bar<T>不是。 -
@songyuanyao 谢谢,就是这样。使用
std::unordered_map::insert解决了这个问题。我只希望错误消息能更有帮助。尽管它确实告诉我它想要默认构造函数(或者更确切地说是一个没有参数的构造函数),但我希望它会告诉我它想要因为operator[]。
标签: c++ templates unordered-map