0

我有以下功能:

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 类型的情况下正确定义合并函数?

4

2 回答 2

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);
于 2013-08-22T11:18:52.393 回答
2

用于std::iterator_traits提取您需要的类型,而不是T作为模板参数(尽管您的代码,错误确实暗示了这一点):

std::vector<typename std::iterator_traits<Iterator>::value_type> first(begin, middle), second(middle, end);
于 2013-08-22T11:18:52.223 回答