Как сделать шаблонную функцию специализацией для массива символов?

0

Я пытаюсь сделать специализацию шаблона для типа символьных массивов с пузырьками. По какой-то причине, хотя, когда я собираюсь определить функцию, я получаю сообщение об ошибке над именем функции, и я понятия не имею, почему.

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) {

}
  • 0
    Специализация не соответствует шаблону: нет способа заменить T чем-то, чтобы он дал специализацию. Похоже, что n должно быть не типа T , а типа int (практического), ptrdiff_t (для педантичных формалистов) или size_t (для неинформированного). Я бы пошел с int , если бы я должен был сделать это.
  • 0
    Между прочим, это хорошая идея (экономит труд) - объявлять каждую переменную управления цикла в заголовке цикла, например, for( int i = n - 1; ... Вот для чего нужен синтаксис. Эта практика ограничивает область видимости переменной цикла в области исходного кода, где она имеет четко определенное значение, и, таким образом, предотвращает некоторые возможные сценарии ошибок.
Показать ещё 1 комментарий
Теги:
templates
function-templates

1 ответ

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

Проблема:

Когда вы заменяете 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); 

Ещё вопросы

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