gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 04:56:43 30 4
gpt4 key购买 nike

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 上下文。

最佳答案

完整的错误信息可能是这样的:

<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.

您的 map 是常量但operator[] 不是常量,您需要使用find()at() 来检索值来自 const std::mapstd::unordered_map

关于c++ - 将 unordered_map 与 Catch2 谓词一起使用时类型不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52369999/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com