我有这段代码,我试图将unordered_map
中已构造的元素推入向量:
class A {
public:
A(const std::string& a) {}
}
int main() {
std::unordered_map<std::string, A> map {{"A", A("A")}, {"B", A("B")}};
std::vector<A> vec;
vec.push_back(map["A"]);
}
但为什么我收到有关矢量push_back
的错误:
/usr/local/include/c++/6.3.0/tuple:1586:70: error: no matching function for call to 'A::A()'
second(std::forward<_Args2>(std::get<_Indexes2>(__tuple2))...)
^
main.cpp:8:9: note: candidate: A::A(const string&)
A(const std::string& a) {}
^
main.cpp:8:9: note: candidate expects 1 argument, 0 provided
main.cpp:6:7: note: candidate: constexpr A::A(const A&)
class A {
^
main.cpp:6:7: note: candidate expects 1 argument, 0 provided
main.cpp:6:7: note: candidate: constexpr A::A(A&&)
main.cpp:6:7: note: candidate expects 1 argument, 0 provided
答案 0 :(得分:3)
问题是,在使用std::unordered_map::operator[]
(ref)时,mapped_type
(A
)必须为default constructible,key_type
必须为{{} 3}}这不是您示例中std::string
的问题。
#include <iostream>
#include <vector>
#include <string>
#include <unordered_map>
class A {
public:
A(const std::string& a) {}
A() {} // Default constructor
};
int main() {
std::unordered_map<std::string, A> map {{"A", A("A")}, {"B", A("B")}};
std::vector<A> vec;
vec.push_back(map["A"]); // Requires default constructor
vec.push_back(map.at("A")); // Do NOT requires default constructor
}
答案 1 :(得分:3)
对于具有C ++ 11标记的问题,上面的答案可能会提到您不需要默认构造函数的实际实现,但是您可以使用=default
说明符来表示这是只是因为它是必要的。
class A {
public:
A() = default;
A(const std::string& a) {}
}
答案 2 :(得分:2)
std::map::operator[]
requires映射类型(在您的情况下,A
)为default-insertable,因此您必须提供默认构造函数,而不是例如:
class A {
public:
A(){}
A(const std::string& a) {}
}