Проблема с обёртыванием std :: find. Не удалось специализировать шаблон функции - PullRequest
0 голосов
/ 08 марта 2019

Я пытаюсь создать вспомогательную функцию 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 ]

1 голос
/ 08 марта 2019

Вы что-то напутали с типом возврата.Это должно работать:

#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);
}
0 голосов
/ 08 марта 2019

Если вы используете 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();
    }
}

Даже не задавайте тип возврата, и ошибок не будет.Меньше печатать тоже!

...