Перегрузка функции в шаблонной структуре - PullRequest
0 голосов

Для моей домашней работы нам нужно создать шаблонную структуру с различными переменными и функциями.Вот его сокращенная версия:

template <class Type>
struct vekt{
    Type *array;
    int len_of_array;
    int move(vekt<Type>* second, Type start){ ... }
}

Как работает перемещение функции: она проверяет, может ли она переместить первый элемент массива (array [0]) вызывающего vekt во второй vekt,и если это возможно, это так.Вы можете переместить первый элемент вызывающего вектора, если вы можете получить этот элемент как сумму различных элементов из второго -> массива.Тип start является нейтральным элементом для добавления этого типа.

Так, например, для Type = int, если вызывающий vekt имеет это в массиве: [4,5,6], а vekt second имеет это: [3,7,1], функция move вернет 1, потому что первый элемент массива [4,5,6] равен 4, и вы можете получить его, добавив 3 и 1 из массива [3,7,1].Я сделал эту функцию, и она работает.

Это моя проблема: я должен перегрузить эту функцию для Type = char, потому что разные компиляторы видят ее как unsigned или char со знаком.Я понимаю, что я должен сделать, но я не понимаю , как сделать это.Я не знаю, как записать перегрузку в структуру.Могу ли я сделать это, а затем просто написать код, специфичный для char, в первом движении функции?:

template <class Type>
struct vekt{
    Type *array;
    int len_of_array;
    int move(vekt<char>* second, char start){ ... }
    int move(vekt<Type>* second, Type start){ ... }
}

Если нет, то что именно я должен делать?Мой английский не самый лучший, но я надеюсь, что мои объяснения понятны

1 Ответ

1 голос
/ 06 мая 2019

То, что вы хотите сделать, это не перегрузка функция-член (обеспечивающая несколько реализаций для разных типов аргументов для одинаковой vekt специализации), но (явно) специализация это, что можно рассматривать как переопределение его общее определение для случая, когда Type равно char.Синтаксис просто

template<> void vekt<char>::move(vekt *second,char start) {…}

(обратите внимание, что список аргументов шаблона может быть исключен из последующих упоминаний vekt, а также всех упоминаний в шаблоне класса.)

...