явная специализация шаблонов C++

224
27 ноября 2020, 12:40

При объявлении шаблонной функции с явной специализацией для строки( тип char*) появляется ошибка “отсутствуют экземпляры шаблон функции”

    void Function(int *array, int size)
{
    for (int i = 0;i < size;i++)
    {
        array[i] = rand();
        cout << array[i] << "\t";
    }
    cout << endl;
    cout << "_____________________________________________" << endl;
}
void Function(float *array,int size)
{
    FILE *fp;
    fp = fopen("1doc.txt", "r");
    if (fp == NULL)
    {
        cout << "не удалось открыть файл" << endl;
    }
    for (int i = 0;i < size;i++)
    {
        fscanf(fp, "%f", &array[i]);
    }
    fclose(fp);
    for (int i = 0;i < size;i++)
    {
        cout << array[i] << "\t";
    }
    cout << endl;
    cout << "___________________________________" << endl;
}
void Function(char *array)
{
    FILE *fp;
    fp = fopen("2doc.txt", "r");
    if (fp == NULL)
    {
        cout << "не удалось открыть файл" << endl;
    }
    int k = 0;
    while (!feof(fp))
    {
        fscanf(fp, "%c", &array[k]);
        k++;
    }
    fclose(fp);
    cout << array << endl;
    cout << "________________________________________" << endl;
}
template <typename T, typename T3>
T Max(T *&arr, T3 &size)
{
    T max = T(0);
    for (int i = 0; i < size; i++)
    {
        if (abs(arr[i]) > max)max = abs(arr[i]);
    }
    return max;
}
 template <typename T1, typename T2>
T1 Min(T1 *&arr, T2 &size)
{
    T1 min = arr[0];
    for (int i = 0; i < size; i++)
    {
        if (abs(arr[i]) < min)min = abs(arr[i]);
    }
    return min;
}
template <typename H>
H Summas(H *&arr, int &size)
{
    H value = H(0);
    for (int i = 0; i < size; i++)
    {
        value = value + arr[i];
    }
    return value;
}
template<>
char* Summas<char*>(char *&arr, int &size)
{
}
template <typename H2, typename H3>
void push_back(H2 *&arr,H3 &size)
{ 
    H2 *newarr = new H2[size + 2];
    for (int i = 0; i < size; i++)
    {
        newarr[i] = arr[i] + (Max(arr, size) + Min(arr, size)) / 2;
    }

    newarr[size] = Max(arr, size);
    newarr[size + 1] = Summas(arr, size);
    for (int i = 0; i < size+2;i++)
    {
        cout << newarr[i] << "\t";
    }
    cout << endl;
}
int main()
{
    setlocale(LC_ALL, "");
    int size1 = 50, size2 = 25, size3 = 15;
    int *arr1=new int[size1];
    float *arr2=new float[size2];
    char *arr3=new char[size3];
    Function(arr1,size1);
    Function(arr2,size2);
    Function(arr3);
    push_back(arr1, size1);
    cout << "_________________________________" << endl;
    push_back(arr2, size2);
    delete[] arr1;
    delete[] arr2;
    delete[] arr3;
    return 0;
}
Answer 1

Если исходный шаблон объявлен как

template <typename H>
H Summas(H *&arr, int &size)

то его специализация для char * будет иметь вид (подставляем char * вместо H)

template<>
char* Summas<char*>(char **&arr, int &size)

Сравните с тем, что написано у вас и причина ошибки станет понятна.

При этом специализацию можно объявить и чуть короче

template<>
char* Summas(char **&arr, int &size)
READ ALSO
QT: repaint() не перерисовывает виджет

QT: repaint() не перерисовывает виджет

По ТЗ необходимо реализовать построчную закраску многоугольника в двух вариантах - с задержкой после отрисовки каждой линии и без нееЕсть...

115
Вынести функцию в отдельный поток

Вынести функцию в отдельный поток

есть программа, как в аргументы функции передать целый класс, и его изменять так, что-бы именения были видны в main()?

120
В чём разница между decltype(auto) и auto&amp;&amp;?

В чём разница между decltype(auto) и auto&&?

В чём разница между decltype(auto) и auto&&?

100
константное значение n, m

константное значение n, m

Пытаюсь получить транспонированную матрицу, но выдает ошибку Выражение должно иметь константное значение n, m; Не могу понять что не так, пример...

144