Неопределенная ссылка на метод шаблона в C ++

0

Я изучаю шаблоны и пытаюсь преобразовать код 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

Метод iterative_mergesort в файле sort.cpp: Примечание: 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);
}

Наконец, вот основной раздел, который вызывает ошибку компиляции:

  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
    В указанном вами коде нет определения a2. Согласно сообщению об ошибке, его тип двойной, в то время как вы, вероятно, намеревались отсортировать какой-то контейнер.
  • 1
    malloc и free в программе на c ++, yikes. Вы даже свободны в том же объеме - почему бы просто не использовать стек?
Показать ещё 2 комментария
Теги:
templates

2 ответа

2
Лучший ответ

Определение шаблона, метода или класса должно полностью находиться внутри единицы перевода, в которой она была создана.

Переместите содержимое sort.cpp в файл заголовка.

См. Этот вопрос для получения дополнительной информации.

  • 0
    Спасибо! Это было очень ясно.
  • 0
    Хороший, я всегда забываю это. Мне действительно нужно чаще использовать шаблоны
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);
  • 0
    Это решение отчасти побеждает цель использования здесь шаблонов - любой, кто попытается использовать это с новым типом, снова получит исходную ошибку. Почему бы просто не поместить реализацию в заголовочный файл?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню