功能模板不起作用,出现错误“没有合适的用户定义转换”

时间:2019-10-03 16:02:57

标签: c++ c++11

我正在尝试在功能模板上使用容器(std::vectorstd::liststd::map等),但我不断收到错误消息:“没有合适的用户,定义的转化存在”

我尝试制作一个带有1个参数的不同功能模板print_container(),并且它可以正常工作。

#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 个答案:

答案 0 :(得分:2)

问题出在返回的类型

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 :(得分:2)

返回类型为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 :(得分:1)

此声明中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);