由于构造函数而无法推回类对象

Can't push back a class object because of constructor

本文关键字:对象 构造函数      更新时间:2023-10-16

我有这段代码,我尝试将已经构造的元素从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) {}
}