1

私は C++ を再学習しており、単純なアルゴリズムである QuickSort を試すことから始めました。私の関数には次の署名があります。

template <class T>
void QSort(typename std::vector<T>::iterator begin, typename std::vector<T>::iterator end)

そして、それは私のメイン関数で呼び出されます:

int main()
{
    std::vector<int> unsort({56,32,11,45,67,81,12,5});
    std::vector<int>::iterator b=unsort.begin();
    std::vector<int>::iterator e=unsort.end();
    QSort(b, e);
    return 0;
}

そして、このエラーが発生します:

C:\Users\Deus\Projects\QSort\main.cpp||In function 'int main()':|
C:\Users\Deus\Projects\QSort\main.cpp|49|error: no matching function for call to 'QSort(__gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >&, __gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >&)'|
||=== Build finished: 1 errors, 0 warnings ===|

コンパイラは、T がどうあるべきかを解決するのに苦労しているようです。私がやろうとしていることを行う方法はありますか、それとも引数を型 T として宣言し、結果として生じる不確実性を処理する必要がありますか?

4

1 に答える 1

5

コンパイラにはT、関数呼び出しから推測する方法がありません。std::vector<T>::iteratorが の場合に何が起こるか考えてみましょうT*:

int *b = ...;
int *e = ...;
QSort(b, e);

一般に、 と記述typename Something<TemplateParameter>::anotherThingした場合、呼び出しで を推測することはTemplateParemterできません。明示的に指定する必要があります

QSort<int>(b, e);

Tパラメータタイプとして使用することをお勧めします。これにより、ベクトル イテレータだけでなくT*、 、またはstd::deque<T>::iteratorその他のランダム アクセス イテレータも受け入れることができます。

于 2012-07-21T22:19:18.237 に答える