我编写了一个模板函数,用于测试给定容器中是否有键或值。
template<typename T>
bool has_key(const T &t, const typename T::key_type &key) {
return t.find(key) != t.end();
}
template<typename T>
bool has_key(const T &t, const typename T::value_type &v) {
for (auto i = t.begin(); i != t.end(); i++) {
if (*i == v) return true;
}
return false;
}
它适用于std::map
和std::vector
。但是当容器为std::set
时,会发现一个模糊的错误。由于std::set
同时定义了key_type
和value_type
,因此它们属于同一类型。所以我的问题是如何解决这个问题?谢谢!
答案 0 :(得分:1)
使用std :: set两个方法将具有相同的签名。您需要通过更改其中一个方法名称或添加虚拟参数来消除歧义。 E.g。
bool has_key_for_value(const T &t, const typename T::value_type &v);
请注意,您可以使用std::find
直接轻松解决问题