Шаблонная функция C ++. ошибка C2440: «возврат»: невозможно преобразовать из «_FwdIt1» в «_FwdIt1» - PullRequest
0 голосов
/ 01 ноября 2018

Существует std::find_first_of, но нет std::find_last_of. Я хочу сделать такой шаблон самостоятельно. Я обращался к этому коду Есть ли такая функция, как find_last_of в std, но не в строке?

Но эта функция скомпилирована не удалось. Ошибка кажется странной, невозможно конвертировать из _FwdIt1 в _FwdIt1. Они одного типа. Мой компилятор Visual Studio 2017.

template<class _FwdIt1, class _FwdIt2>
        inline _FwdIt1 find_last_of(const _FwdIt1 _First1, const _FwdIt1 _Last1,
            const _FwdIt2 _First2, const _FwdIt2 _Last2)
    {
        return find_first_of(reverse_iterator(_Last1), reverse_iterator(_First1), _First2, _Last2); //error C2440: 'return': cannot convert from '_FwdIt1' to '_FwdIt1'
    }


    void test()
    {
        const char* s = "0123456789";
        char* sb = "54";
        cout<<find_last_of(s, s + strlen(s), sb, sb+strlen(sb));
    }

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018

Я последовал предложению @Lorand. изменил тип возврата на автоматический, все заработало.

    template<class MyFwdIt1,
        class _FwdIt2>
        inline auto find_last_of(const MyFwdIt1 _First1, const MyFwdIt1 _Last1,
            const _FwdIt2 _First2, const _FwdIt2 _Last2)
    {
        return std::find_first_of(reverse_iterator(_Last1), reverse_iterator(_First1), _First2, _Last2);
    }

    void test()
    {
        const char* s = "0123456789";
        char* sb = "54";
        auto it = find_last_of(s, s + strlen(s), sb, sb+strlen(sb));
        cout << it - reverse_iterator(s + strlen(s)) << endl;
    }
0 голосов
/ 01 ноября 2018

Если вы передаете ::std::reverse_iterator в качестве первых двух параметров ::std::find_first_of, то результатом будет также ::std::reverse_iterator, и для получения оригинального итератора вам необходимо использовать метод .base():

return _FwdIt1
{
    find_first_of
    (
         reverse_iterator(_Last1)
    ,    reverse_iterator(_First1)
    ,    _First2
    ,    _Last2
    )
    .base()
};

онлайн-компилятор

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...