3

次のように、cpp関数でテンプレート化されたクイックソートメソッドを参照しています。

Main.cpp

QuickSort<vector<int>>(testData);

testDataは次のとおりです。

int arr[] = {0, 5, 3, 4, 2, 1, 4};
vector<int> testData (arr, arr + sizeof(arr) / sizeof(arr[0]));

.hファイルでのクイックソートの宣言は次のとおりです。

Sorting.h

template <typename T>
void QuickSort(std::vector<T>& Unsorted);

そして、関数の定義は次のとおりです。

Sorting.cpp

template <typename T>
void QuickSort(std::vector<T>& Unsorted) 
{
         //implementation here
}

私は心を失っていますか?参照によってintのベクトルを渡そうとしています。誰かが私がどこで間違っているのか教えてもらえますか?

4

1 に答える 1

4

テンプレートに個別の定義と宣言を含めることはできません

また

QuickSort<int>(vec);

関数の場合、宣言と定義はsaemの場所にある必要があります。

#include <vector>

template <typename T>
void qs(std::vector<T>&v );

int main() {
  std::vector<int> v;
  qs(v);
}


void qs(std::vector<T>&v ) { 
}

コンパイルしないとき

#include <vector>

template <typename T>
void qs(std::vector<T>&v ) {}

int main() {
  std::vector<int> v;
  qs(v);
}

正常にコンパイルされます。テンプレート関数がどのように作成されるかをstlで確認してください。重要なのは、コンパイラはその使用前に関数全体を知っている必要があり、あなたの場合はそうではないということです。

于 2012-07-22T19:24:51.577 に答える