函数模板不起作用,出现错误"No suitable user-defined conversion"

Function Template not working, getting error "No suitable user-defined conversion"

本文关键字:No suitable user-defined conversion 错误 不起作用 函数模板      更新时间:2023-10-16

我正在尝试在函数模板上使用容器(std::vectorstd::liststd::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()应该返回只有 1 个迭代器的迭代器std::vector,迭代器附加到vec1[0]并将该向量分配给res

问题出在返回的类型中

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);

返回类型是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);

此声明中迭代器的模板参数

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);