将unordered_map与Catch2谓词一起使用时类型不匹配

时间:2018-09-17 14:25:23

标签: c++

Catch2提供了一个谓词类来构成我们自己的匹配器。 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类型还是我误解了lambda上下文中的“ / m / entity1”。

1 个答案:

答案 0 :(得分:1)

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

<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()从const std::mapstd::unordered_map检索值。