Ошибка описания шаблонной функции

160
18 апреля 2019, 18:20

DynamicMassives.h

//------------------------------------------------------------- create simple massive
template <typename T>
T * getArray(int &len) {        // returns pointer to dynamic massive
    T *ptr;
    if (!(ptr = new T[len])) {  // conditional of possibility of memory allocation
        cout << "can't allocate memory..." << endl;
        return nullptr;             // protection if there is no memory rest
    }
    else return ptr;
}

Source.cpp

#include <iostream>
#include <ctime>    // for random
#include "DynamicMassives.h"
using namespace std;
int main(void) {
    srand(time(NULL));  // randomize
    //----------------------------------------------- Simple dynamic massive
    cout << "simple dynamic massive:" << endl;
    int *parr;      // pointer for dynamic massive
    int len = 20;   // length of dynamic massive
    parr = getArray(len);   // call for dynamic massive creating function <<<<<<<<<<<<< ERROR!!!!
    cout << endl;
    system("pause");
}

Вывод:

Ошибка C2672 "getArray": не найдена соответствующая перегруженная функция
Ошибка C2783 T *getArray(int &): не удается составить аргумент шаблон для "T"

Подскажите пожалуйста, что не так с шаблоном? Без шаблона с интом везде работала отлично.

Answer 1

Вам нужно явно указать тип для элементов, хранящихся в массиве:

parr = getArray<int>(len); 

Далее:

if (!(ptr = new T[len])) {
    cout << "can't allocate memory..." << endl;
    return nullptr;
}

Поведение оператора new отлично от поведения функции malloc - если по каким-то причинам память не может быть выделена - будет выброшено исключение. Т.о., в C Вы можете использовать подобную конструкцию, а в C++ - нет:

// OK
int* arr;
if (!(arr = (int*)malloc(...)) { ... }
// Неверно
int* arr;
if (!(arr = new int[...])) { ... }

Пример ф-ии в которой тип выводится из ее аргумента:

template<typename T>
auto sum(T _l, T _r) -> decltype(_l + _r) { return _l + _r; }

В ф-ии из Вашего примера тип не может быть выведен автоматически - т.к. в качестве аргумента Вы используете число, характеризующее число элементов в массиве, но никак не тип этих элементов.

READ ALSO
Как добавить подписываемый параметр OCSP RESPONSE в ASN1 PKCS7

Как добавить подписываемый параметр OCSP RESPONSE в ASN1 PKCS7

Занимаюсь подписанием строкиОбычная подпись проходит

136
С++ нарушение прав доступа [закрыт]

С++ нарушение прав доступа [закрыт]

Пытаюсь освоить новый для себя c++ и пишу приложение "blackjack"На данный момент уже долгое время ломаю голову над этой ошибкой - Необработанное...

132
Почему код работает?

Почему код работает?

Собственно то почему этот код должен выбросить ошибку написано в статье: http://scrutatorme/post/2015/12/30/pointers_demystified_p2

182
Динамическое изменение типа std::vector

Динамическое изменение типа std::vector

Как динамически менять тип у вектора в структуре в зависимости от типа записываемого значения, в него могут записываться значения следующего...

166