对C ++中模板方法的未定义引用

时间:2014-11-14 01:45:34

标签: c++ templates

我正在学习模板,并试图通过使用模板将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();

很抱歉发布了这么多代码。我试图在这里只留下相关部分。如果您需要更多背景信息,请告诉我。

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:2)

模板,方法或类的定义必须完全位于实例化的翻译单元中。

sort.cpp的内容移动到您的头文件中。

有关详细信息,请参阅this question

答案 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);