Я пытаюсь сделать специализацию шаблона для типа символьных массивов с пузырьками. По какой-то причине, хотя, когда я собираюсь определить функцию, я получаю сообщение об ошибке над именем функции, и я понятия не имею, почему.
template<typename T>
T sort(T* a, T n) {
int i, j;
int temp;
for (i = n - 1; i > 0; i--) {
for (j = 0; j < i; j++) {
if (a[j] > a[j + 1]) {
temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
}
}
}
template<>
const char* sort<const char*>(const char* a, const char* n) {
}
Проблема:
Когда вы заменяете T
на const char *
, подпись функции выглядит так:
const char* sort<const char*>(const char** a, const char* n)
// ^^^ T* a -> const char ** a
Рекомендуемые:
Почему ваш template<typename T> T sort(T* a, T n)
подписи template<typename T> T sort(T* a, T n)
любом случае? Вы ничего не возвращаете, и вы рассматриваете n
как size_t
. Я рекомендую изменить вашу подпись:
template<typename T> void sort(T* a, size_t n);
И ваша специализация:
template<> void sort<char>(char* a, size_t n);
T
чем-то, чтобы он дал специализацию. Похоже, чтоn
должно быть не типаT
, а типаint
(практического),ptrdiff_t
(для педантичных формалистов) илиsize_t
(для неинформированного). Я бы пошел сint
, если бы я должен был сделать это.for( int i = n - 1; ...
Вот для чего нужен синтаксис. Эта практика ограничивает область видимости переменной цикла в области исходного кода, где она имеет четко определенное значение, и, таким образом, предотвращает некоторые возможные сценарии ошибок.