C ++编译器无法从迭代器派生出正确的类型

时间:2013-08-22 11:15:02

标签: c++ templates

我有以下功能:

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类型的情况下定义合并功能?

2 个答案:

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