我正在尝试创建一个方便功能my::find
,该功能将std::find
包装为std::vector
类型。它可能不是很有用,但是可以使代码更简洁。不幸的是,我无法使返回类型起作用。参见示例:
#include <vector>
namespace my {
template<typename T>
inline typename std::vector<T>::iterator::type find(const std::vector<T>& vector, const T& value)
{
return std::find(vector.begin(), vector.end(), value);
}
template<typename T>
inline bool contains(const std::vector<T>& vector, const T& value)
{
return std::find(vector.begin(), vector.end(), value) != vector.end();
}
}
bool a() {
std::vector<float> v;
float a = 0.0f;
auto found = my::find(v, a);
return found != v.end();
}
bool b() {
std::vector<float> v;
float a = 0.0f;
return my::contains(v, a);
}
我还创建了一个类似的my::contains
函数,效果很好。
当我尝试使用my::find
时收到错误消息:
[x64 msvc v19.16 #1] error C2672: 'my::find': no matching overloaded function found
[x64 msvc v19.16 #1] error C2893: Failed to specialize function template 'std::vector<T,std::allocator<_Ty>>::iterator::type my::find(const std::vector<T,std::allocator<_Ty>> &,const T &)'
[x64 msvc v19.16 #1] note: With the following template arguments:
[x64 msvc v19.16 #1] note: 'T=float'
这是个可笑的地方:https://godbolt.org/z/ri_xoV
答案 0 :(得分:1)
您弄乱了返回类型的内容。这应该起作用:
#include <vector>
namespace my {
template<typename T>
inline typename std::vector<T>::const_iterator find(const std::vector<T>& vector, const T& value)
{
return std::find(vector.begin(), vector.end(), value);
}
template<typename T>
inline bool contains(const std::vector<T>& vector, const T& value)
{
return std::find(vector.begin(), vector.end(), value) != vector.end();
}
}
bool a() {
std::vector<float> v;
float a = 0.0f;
auto found = my::find(v, a);
return found != v.end();
}
bool b() {
std::vector<float> v;
float a = 0.0f;
return my::contains(v, a);
}
答案 1 :(得分:-1)
如果您使用的是C ++ 14,那就更好了。
#include <vector>
namespace my {
template<typename T>
inline auto find(const std::vector<T>& vector, const T& value)
{
return std::find(vector.begin(), vector.end(), value);
}
template<typename T>
inline bool contains(const std::vector<T>& vector, const T& value)
{
return std::find(vector.begin(), vector.end(), value) != vector.end();
}
}
甚至不必费心指定返回类型,并且不会有错误。打字也少!