问题包装std :: find。无法专门化功能模板

时间:2019-03-08 12:25:31

标签: c++ c++11 std

我正在尝试创建一个方便功能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

2 个答案:

答案 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();
    }
}

甚至不必费心指定返回类型,并且不会有错误。打字也少!