c++ - 将 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 上下文。
解决方案
完整的错误消息可能类似于:
<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
。
推荐阅读
- python - 创建交换字典的最简单函数,其中值应该是具有所有相应键的元组
- php - 如何解决转换为渐进式 Web 应用程序的基于 HTML PHP SQL 的网站中不同页面上的重定向会话问题?
- react-native - 删除 android:usesCleartextTraffic="true" 时,获取 Metro Packager 错误“index.android.bundle”已正确打包以便发布
- powershell - powershell -Scope 参数未找到
- python - 对现有数据框创建多个条件列
- docker - Traefik 连接被拒绝
- asp.net - 使用asp.net登录和注册页面,没有收到输入
- spring-boot - spring-boot 2.5.1 - 找不到配置数据位置“consul:”
- windows - 有没有办法“听取”Windows“程序和功能”的变化?
- c# - 如果基类被称为参数,我可以使用派生类函数吗?