0

Итак, задача : Реализовать шаблонные функции (массив передаётся в функцию в качестве параметра), выполняющие следующие действия:

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

template <typename T>
T MaxElem(T *arr, int size)
{
    int indexOfMaxElem = 0;

    for (int pos = 1; pos < size; ++pos)
    {
        if (arr[pos] > arr[indexOfMaxElem])
            indexOfMaxElem = pos;
    }

    return arr[indexOfMaxElem];
}


template <typename T>
T SummOfElem(T *arr, int size)
{
    T summ = 0;

    for (int pos = 0; pos < size;++pos)
        summ += arr[pos];

    return summ;
}

template <typename T>
T *NewArr(T *arr, int size)
{
    T *newArr = new T[size + 2];

    for (int pos = 0; pos < size; ++pos)
        newArr[pos] = arr[pos];

    newArr[size] = MaxElem(arr, size);
    newArr[size + 1] = SummOfElem(arr, size);

    return newArr;
}

так же необходимо сделать специализацию шаблона для типа char*

вот код для функции для char *

int LengthOfWord(char *word)
{
    int length = 0;

    while (*word)
    {
        ++word;
        ++length;
    }

     return length;
 }

int SizeOfArrStr(char **arrOfStr, int count)
{
    int size = 0;

    for (int pos = 0; pos < count; ++pos)
    { 
        size += LengthOfWord(*arrOfStr);
        ++arrOfStr;
    }

    return size;
}

char *EquallyStr(char *resulStr, char *arrOfStr)
{
    while(*arrOfStr)
    {
        *resulStr = *arrOfStr;
        ++resulStr; ++arrOfStr;
    }

    return resulStr;
}

char *SummOfStr(char **arrOfStr, int count) 
{
    char *resultArr = new char[SizeOfArrStr(arrOfStr, count) + 1];
    resultArr[SizeOfArrStr(arrOfStr, count)] = '\0';
    char *arr = resultArr;

    for (int pos = 0; pos < count; ++pos)
    {
        EquallyStr(arr, *arrOfStr);
        arr = EquallyStr(arr, *arrOfStr);
        ++arrOfStr;
    }

    return resultArr;
}

char *SearchMinStr(char *str1, char *str2)
{
    if (LengthOfWord(str1) <= LengthOfWord(str2))
        return str1;

     return str2;
}

bool IsEqualStr(char *str1, char *str2)
{
    if (LengthOfWord(str1) != LengthOfWord(str2))
        return false;

    while (*str1)
    {
        if (*str1!=*str2)
            return false;

        ++str1; ++str2;
    }

    return true;
}

int Compare(char *str1, char *str2)
{
    while (*str1)
    {
        if (*str1 < *str2)
            return -1;
        if (*str1 > *str2)
            return 1;
        if (*str2 == 0)
            return 1;

        ++str1; ++str2; 
    }

    return -1;
}

int CompareOfStr(char *str1, char *str2) 
{
    if (IsEqualStr(str1, str2))
        return 0;

    return Compare(str1, str2);
}

char *MaxElem(char **arrOfStr, int count)
{   
    char *maxElem = *arrOfStr;

    for (int elem = 0; elem < count; ++elem)
    {
        if (CompareOfStr(maxElem, *arrOfStr) == -1)
            maxElem = *arrOfStr;

        ++arrOfStr;
    }

    return maxElem;
}

template <>
char **NewArr (char **arrOfStr, int count)
{
    char **newArr = new char *[count + 2];

    for (int pos = 0; pos < count; ++pos)
    {
        newArr[pos] = new char[LengthOfWord(arrOfStr[pos]) + 1];
        newArr[pos] = arrOfStr[pos];
    } 

    newArr[count] = MaxElem(arrOfStr, count);
    newArr[count + 1] = SummOfStr(arrOfStr, count);

    return newArr;
}

и прототип функции для char * :

template <> char **NewArr (char **arrOfStr, int count);

итак вопрос : где ошибка в реализации специализации шаблона ? вот что говорит компилятор Error 1 error LNK2001: unresolved external symbol "char * * __cdecl NewArr(char * *,int)" (??$NewArr@PAD@@YAPAPADPAPADH@Z)

Harry
  • 221,325
Artem
  • 93
  • 4

0 Answers0