Шаблон функции не работает, появляется ошибка «Нет подходящего пользовательского преобразования» - PullRequest
0 голосов
/ 03 октября 2019

Я пытаюсь использовать контейнер (std::vector, std::list, std::map и т. Д.) В шаблоне функции, но я получаю сообщение об ошибке: «Не существует подходящего пользовательского преобразования»

Я попытался создать другой шаблон функции, print_container() с 1 аргументом, и он работает.

#include "stdafx.h"
#include <iostream>
#include <vector>

template<typename T>
using Iterator = typename T::iterator;

template<typename C, typename V>
std::vector<Iterator<C>> find_all(C& container, V value) {
    std::vector<Iterator<C>> res;
    for (auto p = container.begin(); p != container.end(); ++p)
        if ((*p) == value)
            res.push_back(p);
    return res;
}

int main() {
    std::vector<int> vec1 = { 1, 2, 3 };
    std::vector<Iterator<int>> res = find_all(vec1, 1); // does not work
    return 0;
}

find_all() должен возвращать std::vector итераторов только с 1 итератором, итераторприсоединяется к vec1[0] и присваивает этот вектор res.

Ответы [ 3 ]

2 голосов
/ 03 октября 2019

Тип возврата: std::vector<Iterator<std::vector<int>>>, а не std::vector<Iterator<int>>.

std::vector<Iterator<std::vector<int>>> res = find_all(vec1, 1);

Использование auto лучше для таких случаев, как это.

auto res = find_all(vec1, 1);
2 голосов
/ 03 октября 2019

Проблема в возвращаемом типе

std::vector<Iterator<int>> res = find_all(vec1, 1);
//...................^^^ wrong

Из этого вызова вы получаете вектор итераторов std::vector<int>, а не int

std::vector<Iterator<std::vector<int>>> res = find_all(vec1, 1);
//...................^^^^^^^^^^^^^^^^  correct    

Чтобы избежать этогоКак правило, вы можете использовать auto (начиная с C ++ 11)

auto res = find_all(vec1, 1);
1 голос
/ 03 октября 2019

Аргумент шаблона Iterator в этом объявлении

std::vector<Iterator<int>> res = find_all(v, 1);

Недопустим. Тип int не имеет итераторов. См. Это объявление псевдонима

template<typename T>
using Iterator = typename T::iterator;

Вы должны написать либо

std::vector<Iterator<std::vector<int>>> res = find_all(v, 1);

или

auto res = find_all(v, 1);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...