微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

显式默认的默认构造函数被隐式删除,因为unstructed_map与struct作为键一起使用

如何解决显式默认的默认构造函数被隐式删除,因为unstructed_map与struct作为键一起使用

我有以下Graph类:

void MaterialPop::add(std::string name,std::shared_ptr<MaterialArch> mat){
    std::cout << "ADD : "<<name << std::endl;
    bool alreadyExist = false;
    for (auto var : m_varMaterials) {
        if(var.second == mat){
            alreadyExist = true;
        }
    }
    if(!alreadyExist){
        m_console->addMatName(name);
        m_varMaterials.emplace(name,std::move(mat)); 
        m_views.emplace(name,std::make_shared<MaterialArchView>(m_varMaterials.at(name)));
        m_visibility.emplace(name,true);
    }
}

当我想使用认构造函数构造Graph时,它说class Graph { private: struct Edge { string vertex1{},vertex2{}; int val{}; Edge() = default; ~Edge() = default; explicit Edge(string v1,string v2,int value) : vertex1(std::move(v1)),vertex2(std::move(v2)),val(value) {}; bool operator==(const Edge&) const; }; unordered_map<Edge,Edge*> edges; public: Graph() = default; ~Graph(); } 。我应该如何更改代码才能使用Graph的认构造函数

解决方法

unordered_map中的 Key 必须是可哈希的。通过添加std::hash类模板的特殊化,或者在创建unordered_map时提供哈希函数。

您还没有证明自己做了std::hash<Edge>专业化,也没有使用函子来创建unordered_map来进行哈希处理,这就是默认构造失败的原因。

要添加std::hash<Edge>专业化,您可以这样做(如果您公开Edge):

namespace std {

template<>
struct hash<Graph::Edge> {
    size_t operator()(const Graph::Edge& e) const {
        size_t hash_result;
        // calculate the hash result
        return hash_result;
    }
};

} // namespace std

如果您想保留Edge private,则使用函子可能会更容易。这是一个struct形式的示例,该示例使unordered_map默认可构造:

class Graph {
private:
    struct Edge {
        // ...
    };

    // the hashing functor:
    struct edge_hasher {
        size_t operator()(const Edge& e) const {
            // an example implementation using boost::hash_combine
            // from <boost/container_hash/hash.hpp>:
            std::hash<std::string> h;
            size_t hash_result = 0;
            boost::hash_combine(hash_result,h(e.vertex1));
            boost::hash_combine(hash_result,h(e.vertex2));
            boost::hash_combine(hash_result,std::hash<int>{}(e.val));
            return hash_result;
        }
    };

    std::unordered_map<Edge,Edge*,edge_hasher> edges; // <- hasher included

public:
    Graph() = default;
    ~Graph();
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。