我正在编写算法文本,尝试用C ++实现所有内容。但我似乎无法弄清楚模板。我有三个文件: algPlayground.h
#include <stdlib.h>
#include <vector>
using namespace std;
template <class T> void insertionSort(vector<T>& toSort);
algPlayground.cpp
#include <stdlib.h>
#include <vector>
#include "algPlayground.h"
using namespace std;
template <class T> void insertionSort(vector<T>& toSort) {
for (int j=1; j < toSort.size(); ++j) {
T key = toSort[j];
int i = j-1;
while (i > -1 && toSort[i] > key) {
toSort[i+1] = toSort[i];
i -= 1;
} // end while
toSort[i+1] = key;
} // end for
} // end insertionSort
和algTest.cpp
#include <stdlib.h>
#include <vector>
#include <iostream>
#include "algPlayground.h"
using namespace std;
int main() {
vector<int> vectorPrime(5);
vectorPrime[0]=5;
vectorPrime[1]=3;
vectorPrime[2]=17;
vectorPrime[3]=8;
vectorPrime[4]=-3;
insertionSort(vectorPrime);
for (int i=0; i<vectorPrime.size(); ++i) {
cout << vectorPrime[i] << " ";
}// end for
}
我收到以下错误:
algTest.cpp:(.text+0xb1): undefined reference to `void insertionSort<int>(std::vector<int, std::allocator<int> >&)'
collect2: error: ld returned 1 exit status
我看到this thread,有人建议正确的方法是
template<typename T, typename A>
void some_func( std::vector<T,A> const& vec ) {
}
但是当我进行纠正时,我仍然会遇到类似的错误:
algTest.cpp:(.text+0xb1): undefined reference to `void insertionSort<int, std::allocator<int> >(std::vector<int, std::allocator<int> >&)'
collect2: error: ld returned 1 exit status
我不知道我在哪里错了。帮助
答案 0 :(得分:2)
您的问题是您需要在头文件中实现该模板。编译器需要能够在实例化时查看模板的实现,以便生成适当的代码。因此,只需将定义从algPlayground.cpp
移至algPlayground.h
。
实现相同目标的另一种方法是反转#include
s,以便algPlayground.h
#include "algPlayground.cpp"
的底部tpp
。喜欢这种方法的人通常会在实现文件中使用{{1}}扩展名来清楚说明发生了什么。
答案 1 :(得分:1)
问题是您的insertionSort<T>
模板未在algTest.cpp文件中实例化。将模板的定义移动到头文件(推荐)或algTest.cpp,你应该是好的。
您可以查看this question或that question了解详情。