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 に答える