首页 > 解决方案 > 将 unordered_map 与 Catch2 谓词一起使用时类型不匹配

问题描述

Catch2 提供了一个 Predicate 类来制作我们自己的匹配器。https://github.com/catchorg/Catch2/blob/master/docs/matchers.md

我只是在这里测试一个 unordered_map( decltype(getEntity2IdMap())。

namespace Generic {

Predicate<decltype(getEntity2IdMap())>(
    [&](auto& maps) -> bool {
        return maps.size() == 3 &&
            maps["entity1"] == 0 &&
            maps["entity2"] == 1 &&
            maps["entity3"] == 2; },
    "entities were inserted."));

Predicate 类有一个简单的定义。

template <typename T>
class PredicateMatcher : public MatcherBase<T> {
    std::function<bool(T const&)> m_predicate;
    std::string m_description;
public:

    PredicateMatcher(std::function<bool(T const&)> const& elem, std::string const& descr)
        :m_predicate(std::move(elem)),
        m_description(Detail::finalizeDescription(descr))
    {}

    bool match( T const& item ) const override {
        return m_predicate(item);
    }

    std::string describe() const override {
        return m_description;
    }
};

} // namespace Generic

    // The following functions create the actual matcher objects.
    // The user has to explicitly specify type to the function, because
    // infering std::function<bool(T const&)> is hard (but possible) and
    // requires a lot of TMP.
    template<typename T>
    Generic::PredicateMatcher<T> Predicate(std::function<bool(T const&)> const& predicate, std::string const& description = "") {
        return Generic::PredicateMatcher<T>(predicate, description);
    }

但是,clang++ 会产生类型不匹配。

error: no viable overloaded operator[] for type 'const std::__1::unordered_map<std::__1::basic_string<char>,
      unsigned int, std::__1::hash<std::__1::basic_string<char> >, std::__1::equal_to<std::__1::basic_string<char> >,
      std::__1::allocator<std::__1::pair<const std::__1::basic_string<char>, unsigned int> > >'

我想知道maps这里的类型,或者我误解了“/m/entity1”的 lambda 上下文。

标签: c++

解决方案


完整的错误消息可能类似于:

<source>:7:21: error: no viable overloaded operator[] for type 'const std::unordered_map<std::string, int>' (aka 'const unordered_map<basic_string<char>, int>')

    std::cout << map["test" ] == 1;

                 ~~~^~~~~~~

unordered_map.h:963:7: note: candidate function not viable: 'this' argument has type 'const std::unordered_map<std::string, int>' (aka 'const unordered_map<basic_string<char>, int>'), but method is not marked const

      operator[](const key_type& __k)

      ^

unordered_map.h:967:7: note: candidate function not viable: 'this' argument has type 'const std::unordered_map<std::string, int>' (aka 'const unordered_map<basic_string<char>, int>'), but method is not marked const

      operator[](key_type&& __k)

关键线索是'this' argument has type 'const.... but method is not marked const

您的地图是 const 但operator[]不是 const,您需要使用find()at()从 conststd::map或中检索值std::unordered_map


推荐阅读