由于构造函数而无法推回类对象
Can't push back a class object because of constructor
我有这段代码,我尝试将已经构造的元素从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
问题是当使用std::unordered_map::operator[]
(ref(时,您的mapped_type
(A
(必须是默认可构造的,key_type
必须是可移动的,这不是示例中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
}
由于问题具有 C++11 标记,上面的答案可能会提到您不需要默认构造函数的实际实现,但您可以使用 =default
说明符来传达这是需要它的唯一原因。
class A {
public:
A() = default;
A(const std::string& a) {}
}
std::map::operator[]
要求映射类型(在您的情况下为 A
(是默认可插入的,因此您必须提供一个默认构造函数,而您没有,例如:
class A {
public:
A(){}
A(const std::string& a) {}
}
相关文章:
- 类中的 Arduino 对象构造函数设置垃圾值
- 编译错误:临时对象构造函数中缺少参数
- 双指针在使用 new 时不调用对象构造函数
- 以支持继承的方式将自身shared_ptr添加到对象构造函数中的向量中
- 在创建对象向量时,不为每个对象唯一调用默认对象构造函数
- GCC __attribute__((constructor)) 在对象构造函数之前调用
- 自定义对象构造函数在循环外部循环
- 从全局对象构造函数停止监视器计时器
- Arduino 上的 Sketch 停止在对象构造函数中执行
- 通过在引用线程对象来传递取消引用的“this”指针来在函数对象构造函数中创建线程是好是坏
- 为什么当对象构造函数投入新表达式时,为什么不调用DealLocation函数
- 临时结构对象构造函数奇数调用
- 未显式引用对象的全局对象构造函数在最终二进制文件 - LD 中被丢弃
- 为什么 Clang++ 不在另一个静态库中运行全局对象构造函数?
- 在未加载上下文的情况下在对象构造函数中使用OpenGL函数
- 为什么我们需要一个用户提供的const对象构造函数
- 对象构造函数的C++数组
- 将子结构值设置为对象构造函数中安全的纯虚拟函数返回的值
- C等价于新对象(构造函数)
- C++:直接在参数列表中使用数组文字的对象构造函数