我有以下功能:
template <typename Iterator>
void merge(Iterator begin, Iterator middle, Iterator end) {
std::vector<T> first(begin, middle), second(middle, end);
auto i1 = first.begin();
auto i2 = second.begin();
while (begin != end) {
if (i2 == second.end() || *i1 < *i2) {
*begin = *i1;
++i1;
} else {
*begin = *i2;
++i2;
}
++begin;
}
}
但是当我尝试使用它时:
int data[] = {1,2,3,4,5,6,7,8};
merge(data, data + 4, data + 8);
我收到错误:
candidate template ignored: couldn't infer template argument 'T'
如何在不明确指定T类型的情况下定义合并功能?
答案 0 :(得分:3)
编译器如何猜测T
是什么?您既没有提供任何上下文来推断它,也没有明确告诉它(在任何情况下,T都需要在模板参数列表like template<typename T, typename Iterator>
中声明)。
我在这里使用iterator_traits
:
typedef typename std::iterator_traits<Iterator>::value_type T;
std::vector<T> first(begin, middle), second(middle, end);
答案 1 :(得分:2)
使用std::iterator_traits
提取您需要的类型,而不是让T
成为模板参数(尽管您的代码存在错误,但错误确实是暗示的):
std::vector<typename std::iterator_traits<Iterator>::value_type> first(begin, middle), second(middle, end);