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

时间:2017-02-08 08:07:25

标签: c++ c++11 vector unordered-map

我有这段代码,我试图将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

3 个答案:

答案 0 :(得分:3)

问题是,在使用std::unordered_map::operator[] (ref)时,mapped_typeA)必须为default constructiblekey_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) {}
}