Я изучаю шаблоны и пытаюсь преобразовать код 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();
Извините за размещение большого количества кода. Я попытался оставить здесь только соответствующие части. Если вам нужно больше контекста, скажите мне.
Любая помощь будет оценена!
Определение шаблона, метода или класса должно полностью находиться внутри единицы перевода, в которой она была создана.
Переместите содержимое sort.cpp
в файл заголовка.
См. Этот вопрос для получения дополнительной информации.
Привет, я понял проблему. Мне пришлось объявить прототипы шаблонов внизу с ожидаемыми типами.
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);
malloc
иfree
в программе на c ++, yikes. Вы даже свободны в том же объеме - почему бы просто не использовать стек?