【发布时间】:2019-06-18 11:17:52
【问题描述】:
我有以下模板函数,它以模板模板参数为参数。
template<typename T,
template <typename... ELEM> class CONTAINER = std::vector>
void merge(typename CONTAINER<T>::iterator it )
{
std::cout << *it << std::endl;
}
下面的代码使用了这个代码。
std::vector<int> vector1{1,2,3};
merge<int>(begin(vector1));
它按预期工作,但是当我使用时
merge(begin(vector1));
无法推断T的类型。
我认为它可以从std::vector<int>::iterator it; 推断类型为int。
为什么编译器不能推断出类型?
【问题讨论】:
-
建议:搜索“非推断上下文”
-
这个问题是在 3 天前提出的(并已回答):stackoverflow.com/questions/56626007/…。
-
他正在尝试完全相同的事情 - 尝试根据 T::iterator 类型推断类型 T。这在函数和类中都是不可能的。
-
请注意,您也不是在推断
CONTAINER,而是使用默认值。std::set<int> set1 {1, 2, 3}; merge<int>(begin(set1));fails -
如果只需要从
decltype(it)获取int,那么使用std::iterator_traits<>::value_type。例如。template <typename Iterator, typename Value = std::iterator_traits<Iterator>::value_type> void merge(Iterator it)
标签: c++ templates c++14 template-argument-deduction template-templates