我正在学习模板,并试图通过使用模板将C代码转换为C ++代码。 我编译时收到以下错误消息。
undefined reference to `void iterative_mergesort<double>(std::vector<double, std::allocator<double> >&)'
我不知道出了什么问题。我在头文件中包含了模板方法,并多次重新检查我的代码。这个错误很模糊,我不知道从哪里开始寻找。
这是我的头文件:
#if !defined(__SORT_HPP_CS303)
#define __SORT_HPP_CS303
#include <vector>
using std::vector;
template <typename T> void insertion_sort (T *a, long int n);
template <typename T> void insertion_sort (vector<T> &a);
template <typename T> bool are_identical(T *a, T *b, long int n);
template <typename T> bool are_identical(vector<T> &a, vector<T> &b);
template <typename T> void recursive_mergesort (T *a, long int n);
template <typename T> void recursive_mergesort (vector<T> &a);
template <typename T> void iterative_mergesort (T *a, long int n);
template <typename T> void iterative_mergesort (vector<T> &a);
#endif
sort.cpp文件中的iterative_mergesort方法:注意:sort.cpp不是类或任何东西,只是方法的集合。
template <typename T> void iterative_mergesort (T *a, long int n){
T * aux = (T *) malloc(n*sizeof(T));
for (long int size = 1; size < n; size = size + size) {
for (long int low = 0; low < n - size; low += size + size) {
merge(a, aux, low, low + size - 1, min(low + size + size - 1, n - 1));
}
}
free(aux);
}
template <typename T> void iterative_mergesort (vector<T> &a){
T * aux = (T *) malloc(a.size()*sizeof(T));
for (long int size = 1; size < a.size(); size = size + size) {
for (long int low = 0; low < a.size() - size; low += size + size) {
merge(a, aux, low, low + size - 1, min(low + size + size - 1, a.size() - 1));
}
}
free(aux);
}
最后,这是main中导致编译错误的部分:
t_start = std::chrono::high_resolution_clock::now();
iterative_mergesort(a2); # this line is giving me trouble. a2
t_end = std::chrono::high_resolution_clock::now();
很抱歉发布了这么多代码。我试图在这里只留下相关部分。如果您需要更多背景信息,请告诉我。
任何帮助将不胜感激!
答案 0 :(得分:2)
答案 1 :(得分:0)
您好我发现了问题。我不得不在底部用他们期望的类型声明模板的原型。
template void iterative_mergesort<double>(double*, long int);
template void iterative_mergesort<double>(vector<double> &);
template void iterative_mergesort<string>(vector<string> &);
template void recursive_mergesort<double>(double*, long int);
template void recursive_mergesort<double>(vector<double> &);
template void recursive_mergesort<string>(vector<string> &);
template void sort<double>(double*, double*, long int, long int);
template void sort<double>(vector<double> &, vector<double> &, long int, long int);
template void sort<string>(vector<string> &, vector<string> &, long int, long int);
template void merge<double>(double*, double*, long int, long int, long int);
template void merge<double>(vector<double> &, vector<double> &, long int, long int, long int);
template void merge<string>(vector<string> &, vector<string> &, long int, long int, long int);