根据this previous question的答案,我编写了下面的模板,如果数组包含传递的值,则返回true,否则返回false。
template <typename Type>
bool Contains(const Type container[], const Type& value) {
return std::any_of(
std::begin(container), std::end(container),
[&value](const Type& contained_value) { return value == contained_value; });
}
当我尝试编译时,出现以下错误:
error: no matching function for call to 'begin'
std::begin(container), std::end(container),
导致std::begin
失败的原因是什么? std::begin documentation显示它适用于数组。在这个特定的例子中,我在枚举(而不是枚举类)上实例化模板。
答案 0 :(得分:3)
Contains
的类型有误,因此container
推断为const int *&
,std:begin
没有覆盖
来自g ++的错误消息更清晰:
main.cpp:实例化'bool Contains(const Type *,const Type&amp;) [with Type = int]':main.cpp:18:34:从这里需要
main.cpp:9:17:错误:没有匹配函数来调用'begin(const INT *安培)”
这是固定代码。您需要将数组作为数组类型(int[3]
)传递,以便std::end
从类型中计算出数组的长度。
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
template <typename Type, std::size_t N>
bool Contains(Type (&container)[N], const Type& value) {
return std::any_of(
std::begin(container), std::end(container),
[&value](const Type& contained_value) { return value == contained_value; });
}
int main()
{
int a[] = {1,2,3};
int val = 1;
int val2 = 4;
bool result = Contains(a, val);
bool result2 = Contains(a, val2);
std::cout << result << std::endl;
std::cout << result2 << std::endl;
}