我试图在功能模板上使用容器(std::vector
,std::list
,std::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
迭代器,该迭代器附加到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);
关于c++ - 功能模板不起作用,出现错误“没有合适的用户定义转换”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58222954/